Mam dwa następujące pliki (wypełniałem linie kropkami, więc każda linia w pliku ma tę samą szerokość i utworzyłam plik1 wszystkie wielkie litery, aby było bardziej wyraźne).
contents of file1:
ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE
contents of file2
Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Zauważ, że plik2 jest dłuższy niż plik1.
Po uruchomieniu tego polecenia:
paste file1 file2
Dostaję ten wynik
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Co mogę zrobić, aby wynik był następujący?
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
próbowałem
paste file1 file2 | column -t
ale robi to:
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
nie tak brzydkie jak oryginalne wyjście, ale i tak niewłaściwe pod względem kolumn.
text-processing
columns
paste
Tulains Córdova
źródło
źródło
paste
używa tabulatorów przed wierszami z drugiego pliku. Być może będziesz musiał użyć postprocesora, aby odpowiednio wyrównać kolumny.paste file1 file2 | column -tn
?Odpowiedzi:
Zakładając, że nie masz żadnych znaków tabulacji w swoich plikach,
z argumentem
-t
odpowiednio dobranym do pokrycia żądanej maksymalnej szerokości linii w pliku 1.OP dodał bardziej elastyczne rozwiązanie:
Zrobiłem to, więc działa bez magicznej liczby 13:
Nie jest łatwo pisać, ale można go użyć w skrypcie.
źródło
Pomyślałem, że awk może to zrobić ładnie, więc poszukałem „awk czytającego dane wejściowe z dwóch plików” i znalazłem artykuł o stosie przepływu jako punkt wyjścia.
Najpierw jest wersja skrócona, a następnie całkowicie skomentowana poniżej. Zajęło to kilka minut. Byłbym zadowolony z udoskonaleń od mądrzejszych ludzi.
A oto w pełni udokumentowana wersja powyższego.
źródło
Niezbyt dobre rozwiązanie, ale udało mi się to zrobić za pomocą
gdzie TAB zostaje zastąpione znakiem tabulacji.
źródło
&&
polecenia sed?&
umieszcza to, co jest wyszukiwane (w tym przypadku tabulator). To polecenie po prostu zastępuje kartę na początku dwiema kartami.TAB
się\t
do tej pracy w zsh na Debianie Ubuntu.W Debianie i pochodnych
column
ma opcję-n
nomerge , która pozwala kolumnie robić właściwe rzeczy z pustymi polami. Wewnętrzniecolumn
używawcstok(wcs, delim, ptr)
funkcji, która dzieli szeroki ciąg znaków na tokeny rozdzielone szerokimi znakami wdelim
argumencie.wcstok
zaczyna się od pominięcia szerokich znakówdelim
przed rozpoznaniem tokena.-n
Opcja wykorzystuje algorytm, który nie pominąć początkowe szerokokątny znakidelim
.Niestety, nie jest to zbyt przenośne:
-n
jest specyficzne dla Debiana icolumn
nie znajduje się w POSIX, najwyraźniej jest to kwestia BSD.źródło
Usuwanie kropek użytych do wypełnienia:
plik1:
plik2:
Spróbuj tego:
I dostaniesz:
źródło
paste
, nie wydrukuje poprawnego wydruku, jeśli są jakieś wiersze zawierające tabulatory. +1 za bycie innymawk
Rozwiązanie, które powinno być dość przenośne i powinny pracować dla dowolnej liczby plików wejściowych:źródło
paste-awk
i próbowałempaste file1 file2|paste-awk
i próbowałem,awk paste-awk file1 file2
ale żaden nie działał.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zero
awk -f paste-awk file1 file2
powinien działać, przynajmniej dla GNU awk i mawk.paste
między dwoma rzędami jest mniej miejsca. A jeśli plik wejściowy nie ma wszystkich wierszy tej samej długości, spowoduje to wyrównanie wiersza do prawej-F\\t