Antworten:
Dies ist technisch gesehen das, was cat
("verketten") tun soll, obwohl die meisten Leute es nur für die Ausgabe von Dateien auf stdout verwenden. Wenn Sie ihm mehrere Dateinamen geben, werden alle nacheinander ausgegeben, und Sie können dies in eine neue Datei umleiten. Im Falle aller Dateien verwenden Sie einfach *
(oder /path/to/directory/*
wenn Sie nicht bereits im Verzeichnis sind) und Ihre Shell wird es auf alle Dateinamen erweitern
$ cat * > merged-file
numeric_glob_sort
Option einstellen ).
Wenn sich Ihre Dateien nicht im selben Verzeichnis befinden, können Sie vor der Verkettung den Befehl find verwenden:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
Sehr nützlich, wenn Ihre Dateien bereits bestellt sind und Sie sie zusammenführen möchten, um sie zu analysieren.
Tragbarer:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Dadurch wird möglicherweise die Dateireihenfolge beibehalten oder nicht.
"*.csv"
, da die Shell dann das Literal *
an übergeben würde find
.
Der Befehl
$ cat * > merged-file
Tatsächlich hat dies den unerwünschten Nebeneffekt, dass "zusammengeführte Datei" in die Verkettung einbezogen wird und eine weggelaufene Datei erstellt wird. Um dies zu umgehen, schreiben Sie entweder die zusammengeführte Datei in ein anderes Verzeichnis.
$ cat * > ../merged-file
oder verwenden Sie eine Musterübereinstimmung, bei der die zusammengeführte Datei ignoriert wird.
$ cat *.txt > merged-file
cat * > merged-file
funktioniert gut. Globs werden verarbeitet, bevor die Datei erstellt wird. Falls merged-file
bereits vorhanden, erkennt cat
(zumindest meine), dass es sich um die Ausgabedatei handelt, und lehnt es ab, sie zu lesen. WENN die Datei bereits existiert UND Sie die Umleitung später in der Pipeline haben, kann sie das offensichtlich nicht, und erst dann erhalten Sie die außer Kontrolle geratene Datei.
cat
kann nicht erkennen, ob es sich bei der Datei um die Ausgabe handelt. Die Umleitung erfolgt in der Shell. cat
druckt nur auf stdout.
Wie die anderen von hier sagen ... können Sie verwenden cat
Sagen wir, Sie haben:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
Und du willst nur file01
zu file03
und fileA
zu fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Oder verwenden Sie die Klammererweiterung:
cat ~/file0{1..3} ~/file{A..C} > merged-file
Oder mit einer schickeren Klammererweiterung:
cat ~/file{0{1..3},{A..C}} > merged-file
Oder Sie können for
Schleife verwenden:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
nicht als Globbing-Muster funktioniert.
Sie können das pattern
einer Datei angeben und dann alle wie folgt zusammenführen:
cat *pattern* >> mergedfile
Eine andere Option ist sed:
sed r 1.txt 2.txt 3.txt > merge.txt
Oder...
sed h 1.txt 2.txt 3.txt > merge.txt
Oder...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
Oder ohne Weiterleitung ...
sed wmerge.txt 1.txt 2.txt 3.txt
Beachten Sie, dass in der letzten Zeile auch merge.txt geschrieben wird (nicht wmerge.txt!). Sie können w "merge.txt" verwenden, um Verwechslungen mit dem Dateinamen zu vermeiden, und -n für die stille Ausgabe.
Natürlich können Sie die Dateiliste auch mit Platzhaltern kürzen. Beispielsweise können Sie bei nummerierten Dateien wie in den obigen Beispielen den Bereich in geschweiften Klammern angeben:
sed -n w"merge.txt" {1..3}.txt
*
in "natürlicher" Reihenfolge ausdehnt . Wenn Sie "file1.txt ... file9.txt ... file14.txt" haben, funktioniert dies nicht, da file1? .Txt zwischen file1.txt und file2.txt sortiert. Sie müssten sie in "file01.txt ... file09.txt ... file14.txt" umbenennen. Sagenecho *
Sie, wenn Sie sich nicht sicher sind.