Kombinieren Sie zwei Textdateien mit Trennzeichen zwischen?

16

cat file1 file2kombiniert zwei Textdateien. Wenn ich jedoch ein Trennzeichen wie ein oder zwei Zeilen dazwischen einfügen möchte ********************************, muss ich die erste Datei öffnen und die Zeile am Ende hinzufügen oder die zweite Datei öffnen und die Zeile oben einfügen und dann ausführen der catBefehl? Kann man dazu einfach einen Befehl ausführen?

Tim
quelle

Antworten:

17

In bashund zshSie können tun:

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

oder als mikeserv in seinem Kommentar angegeben (in jeder Schale):

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

und in Bash als David Z kommentierte:

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

Alle Zeilenumbrüche in den Dateien werden angezeigt. Wenn Sie nach dem "Trennzeichen" keine neue Zeile einfügen möchten (z. B. wenn file2mit einer neuen Zeile begonnen wird), können Sie echo -n '****'die neue Zeile nach dem "Trennzeichen" unterdrücken *.

Anthon
quelle
7
Sie können das gleiche in jeder Shell tun wieecho '**********************' |cat file - file2
mikeserv
Vielen Dank. Fügt cat implizit immer eine neue Zeile zwischen Dateien ein?
Tim
1
@ Tim - auf jeden Fall echoimmer.
mikeserv
1
@ Tim - sieht hier nicht so aus, aber seht selbst -printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeserv
1
Mit @Tim können Sie ...<(echo -n '****')das Echo der Newline unterdrücken. catZeigt nur eine an, wenn die Datei eine hat (am Ende).
Anthon
6

Ein anderer Ansatz, ohne catwie von hier gefunden zu verwenden ,

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

Die letzte sed 1dPipe ist das Entfernen der ersten Zeile, die auch das Trennzeichen enthält.

Die endgültige sedVerwendung könnte jedoch sehr gut vermieden werden, wenn wir den von 1_CR in seinen Kommentaren vorgeschlagenen Befehl verwenden .

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2
Ramesh
quelle
1
Sie können dies vermeiden, sedindem Sie das awkMuster aufFNR == 1 && NR != 1
iruvar 23.10.14
Herzlichen Glückwunsch zum Erreichen von 10K!
G-Man sagt, dass Monica
@ G-Man, vielen Dank. Das ist so nett von dir zu gragulieren :)
Ramesh
Dies ermöglicht eine einfache Erweiterung der Regex von Dateimustern
Paul
3

Sie können es auch in mehrere Befehle aufteilen:

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

Und Sie können dies mit einem Gruppenbefehl oder einer Subshell weiterleiten oder umleiten:

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

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

Natürlich können Sie das über mehrere Zeilen schreiben, anstatt wie normal Semikolons zu verwenden. Und es ist einfach, mit einem anderen Trennzeichen usw. auf eine andere Datei zu erweitern.

derobert
quelle
2

Mit paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
cuonglm
quelle