Ich habe mehrere Dateien, mit denen ich mich befassen möchte cat
. Sagen wir
File1.txt
foo
File2.txt
bar
File3.txt
qux
Ich möchte mich darauf konzentrieren, dass die endgültige Datei wie folgt aussieht:
foo
bar
qux
Stattdessen mit üblich cat File*.txt > finalfile.txt
foo
bar
qux
Was ist der richtige Weg, um es zu tun?
Antworten:
Du kannst tun:
Stellen Sie sicher, dass die Datei
finalfile.txt
nicht vorhanden ist, bevor Sie den obigen Befehl ausführen.Wenn Sie verwenden dürfen, können
awk
Sie Folgendes tun:quelle
AWK '{print $0}' *.txt
awk 'FNR==1 && NR > 1 ...'
.>finalfile.txt
nach dem setzendone
, können Sie überschreiben anstatt anzuhängen, wodurch die Anforderung beseitigt wird, sicherzustellen, dass die Datei vor der Schleife fehlt oder leer ist.Wenn Sie nur wenige Dateien haben, die Sie auflisten können, können Sie die Prozessersetzung in Bash verwenden und zwischen jedem Dateipaar eine neue Zeile einfügen:
quelle
Wenn ich es tun würde, würde ich sed verwenden:
In diesem sed-Muster hat $ zwei Bedeutungen: Erstens entspricht es nur der letzten Zeilennummer (als Bereich von Zeilen, auf die ein Muster angewendet werden soll) und zweitens dem Zeilenende im Substitutionsmuster.
Wenn Ihre Version von sed keine hat
-s
(Eingabedateien separat verarbeiten), können Sie dies alles als Schleife ausführen:quelle
sed -s '$G' *.txt > finalfile.txt
find
anstelle von verwendet habe*.txt
, was bedeutete, dass die Datei an sich selbst angehängt wurde!Sie können es verwenden,
xargs
wenn Sie möchten, aber die Hauptidee ist immer noch dieselbe:quelle
xargs
viel einfacher zu benutzen als Loops in Bash.Dies funktioniert in Bash:
Im Gegensatz zu Antworten mit
>>
(Anhängen) kann die Ausgabe dieses Befehls in andere Programme geleitet werden.Beispiele:
for f in File*.txt; do cat $f; echo; done > finalfile.txt
(for ... done) > finalfile.txt
(Parens sind optional)for ... done | less
(Rohrleitungen in weniger)for ... done | head -n -1
(Dadurch wird die nachfolgende Leerzeile entfernt.)quelle
So habe ich es gerade unter OsX 10.10.3 gemacht
da der einfache 'echo'-Befehl ohne Parameter in keinen neuen Zeilen eingefügt wurde.
quelle
In Python verkettet sich dies mit Leerzeilen zwischen Dateien (dies
,
unterdrückt das Hinzufügen einer zusätzlichen nachgestellten Leerzeile):Hier ist der hässliche Python-Einzeiler, der von der Shell aufgerufen werden kann und die Ausgabe in eine Datei druckt:
quelle