polecenie wklej: ustawienie (wielu) ograniczników

9

W systemie Linux mam następujący problem z paste(GNU coreutils) 8.13:

Próba ustawienia innego separatora niż domyślny (TAB) powoduje albo wydrukowanie pierwszego znaku zdefiniowanego separatora, albo jego całkowite zignorowanie.

Pytanie : Jak definiuje się (wiele) ograniczników podczas używania paste ?

Po prostu użycie np. Abc-123 jako separatora byłoby miło. Przez „wielokrotność” mam na myśli np. 2 TABS zamiast jednego.


Wzory otaczające ograniczniki, których do tej pory próbowałem, były

  • --delimiters="\delimiter"
  • --delimiters='\delimiter'
  • --delimiters=$"\delimiter"
  • --delimiters=$'\delimiter'

Wszystko z tym samym rezultatem: tylko pierwsza postać jest akceptowana lub doskonale ignorowana. Wypróbowałem także krótką wersję -d"\"i wiele instancji & ndahs; nic.

Również:

  • --delimiters="\\" → Komunikat o błędzie

Co działa idealnie, choć nie to, czego chcę:

  • --delimiters="\n" → nowa linia
  • --delimiters="\0" → nic pomiędzy
  • --delimiters="\t"TABdomyślne. Świetny.
erch
źródło

Odpowiedzi:

17

Aby mieć abcpomiędzy plikiem 1 a plikiem 2, możesz:

paste -d abc file1 /dev/null /dev/null file2

Lub:

paste -d abc file1 - - file2 < /dev/null

Jeśli chcesz dwie karty:

paste file1 /dev/null file2
Stéphane Chazelas
źródło
działa „ używanie /dev/nulldo tworzenia dwóch kolumn w przetwarzaniu tekstu ” (poza tym: czy to powszechna wiedza, której do tej pory brakowało, a jeśli nie: skąd masz te informacje?)
erch
1
@ Chirp.NotLuke. /dev/nullpodczas czytania działa jak pusty plik, więc wklejasz file1, i pusty plik, i pusty plik, plik2 z separatorami z kolei a, bi c. Szczegółowe informacje na temat -ddziałania na pastestronie man.
Stéphane Chazelas
@ StéphaneChazelas można również dodać pr -mts'abc' file1 file2jako alternatywę?
Sundeep
4

Dzieje się tak dlatego, że podajesz tylko dwa pliki do połączenia, każdy znak ciągu separatora jest używany między każdym połączeniem linii z każdego pliku wejściowego.

na przykład

file1 line1 DELIMCHAR0 file2 line1 DELIMECHAR1 file3 line1 ...
file1 line2 DELIMCHAR0 file2 line2 DELIMECHAR1 file3 line2 ...
...
X Tian
źródło
2

W systemach BSD lam(o ile nie wiem o Linuksie) istnieje narzędzie (jak w „laminacie”), które jest szybsze i krótsze niż powyższe rozwiązanie:

lam file1 -s delimiter file2
emm
źródło