połączyć dwa pliki tekstowe z dodaniem separatora między?


16

cat file1 file2połączy dwa pliki tekstowe. Ale jeśli chcę dodać jakiś separator między, na przykład linię lub dwie ********************************, muszę otworzyć pierwszy plik i dodać linię na jej końcu, lub otworzyć drugi plik i dodać linię na górze, a następnie uruchomić catpolecenia? Czy można to zrobić po prostu uruchamiając polecenie?

Odpowiedzi:


17

W bashi zshmożesz zrobić:

cat file1 <(echo '********************************') file2

lub jak wskazał mikeserv w swoim komentarzu (w dowolnej powłoce):

echo '********************************' | cat file1 - file2

oraz w Bash, jak skomentował David Z:

cat file1 - file2 <<< '********************************'

Zostaną wyświetlone wszystkie nowe wiersze w plikach. Jeśli nie chcesz nowej linii po „separatorze” (np. Jeśli file2zaczyna się od nowej linii), możesz użyć echo -n '****', więc pomiń nową linię po *.


7
możesz zrobić to samo w dowolnej powłoceecho '**********************' |cat file - file2
mikeserv

dzięki. czy cat zawsze domyślnie dodaje nową linię między plikami?
StackExchange dla wszystkich

1
@Tim - zdecydowanie echozawsze tak jest.
mikeserv

1
@Tim - nie wygląda tutaj w ten sposób, ale przekonaj się sam -printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeserv

1
@Tim możesz użyć, ...<(echo -n '****')aby ukryć znak nowej linii od echa. catpokazuje tylko jeden, gdy plik ma jeden (na końcu).
Anthon

6

Inne podejście bez użycia, catjak stwierdzono tutaj ,

awk 'FNR==1{print "******"}{print}' file1 file2 | sed '1d'

Ostatnim sed 1dpotokiem jest usunięcie pierwszego wiersza, który również będzie miał ogranicznik.

Jednak ostatecznego sedużycia można bardzo dobrze uniknąć, jeśli użyjemy polecenia sugerowanego przez 1_CR w jego komentarzach.

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2

1
możesz tego uniknąć sed, zmieniając awkwzór naFNR == 1 && NR != 1
iruvar

Gratulujemy osiągnięcia 10 000!
G-Man mówi „Przywróć Monikę”

@ G-Man, wielkie dzięki. Miło z twojej strony, że gratuluję :)
Ramesh

Umożliwia to łatwe rozszerzenie wyrażeń regularnych wzorców plików
Paul

3

Możesz także podzielić go na wiele poleceń:

cat file1; echo '------------'; cat file2

I możesz potokować lub przekierowywać to za pomocą polecenia grupy lub podpowłoki:

# GROUP COMMAND:
{ cat file1; echo '----------'; cat file2; } | other-command
#                                        ^ final semicolon is part of the syntax!

# SUBSHELL:
( cat file1; echo '----------'; cat file2 ) | other-command

Oczywiście, możesz napisać to w wielu wierszach zamiast używać średników, jak zwykle. Łatwo jest rozszerzyć na inny plik z innym ogranicznikiem itp.


2

Z paste:

$ echo '********************************' | paste -sd$'\n' file1 - 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.