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.

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

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 ...
...

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.