Es kann vorkommen, dass Sie mehrere Dateien haben, die Sie in eine einzige Datei zusammenführen müssen. Es könnte sein, dass Sie zuvor eine einzelne Datei in mehrere Dateien aufgeteilt haben und diese einfach wieder zusammenführen möchten, oder Sie haben mehrere Protokolldateien, die Sie in eine einzige zusammenführen möchten. Was auch immer der Grund ist, es ist sehr einfach, mehrere Textdateien in eine einzige Datei in Linux zusammenzuführen.
Der Befehl in Linux, um mehrere Dateien zu einer Datei zu verbinden oder zusammenzuführen, heißt cat. Der Befehl cat verkettet standardmäßig mehrere Dateien und gibt sie auf der Standardausgabe aus. Sie können die Standardausgabe in eine Datei umleiten, indem Sie den Operator ‚>‘ verwenden, um die Ausgabe auf der Festplatte oder im Dateisystem zu speichern.
Ein weiteres nützliches Dienstprogramm zum Zusammenführen von Dateien ist join, das die Zeilen zweier Dateien auf der Grundlage gemeinsamer Felder verbinden kann. Es kann jedoch nur mit zwei Dateien gleichzeitig arbeiten, und ich habe festgestellt, dass es recht umständlich in der Anwendung ist. In diesem Beitrag werden wir hauptsächlich den Befehl cat behandeln.
Mehrere Dateien in eine einzige zusammenführen
Der Befehl cat nimmt eine Liste von Dateinamen als Argument. Die Reihenfolge, in der die Dateinamen in der Befehlszeile angegeben werden, bestimmt die Reihenfolge, in der die Dateien zusammengeführt oder kombiniert werden. Wenn Sie also mehrere Dateien mit den Namen file1.txt, file2.txt, file3.txt usw. haben…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
Der obige Befehl fügt den Inhalt von file2.txt an das Ende von file1.txt an. Der Inhalt von datei3.txt wird an das Ende der zusammengeführten Inhalte von datei1.txt und datei2.txt angehängt und so weiter… und die gesamte zusammengeführte Datei wird unter dem Namen zusammengeführteDatei.txt im aktuellen Arbeitsverzeichnis gespeichert.
Es kann vorkommen, dass Sie eine übermäßig große Anzahl von Dateien haben, was es schwierig macht, alle Dateinamen einzugeben. Der Befehl cat akzeptiert reguläre Ausdrücke als Eingabedateinamen, d.h. Sie können sie verwenden, um die Anzahl der Argumente zu reduzieren.
bash$ cat file*.txt my*.txt > mergedfile.txt
So werden alle Dateien im aktuellen Verzeichnis zusammengeführt, die mit dem Namen file beginnen und eine txt-Erweiterung haben, gefolgt von den Dateien, die mit my beginnen und eine txt-Erweiterung haben. Sie müssen bei der Verwendung regulärer Ausdrücke vorsichtig sein, wenn Sie die Reihenfolge der Dateien beibehalten wollen. Wenn Sie den regulären Ausdruck falsch verwenden, wirkt sich dies auf die genaue Reihenfolge aus, in der die Dateien zusammengeführt werden.
Eine schnelle und einfache Methode, um sicherzustellen, dass die Dateien in der gewünschten Reihenfolge zusammengeführt werden, besteht darin, die Ausgabe eines anderen Dateilistenprogramms wie ls oder find zu verwenden und sie über die Pipeline an den Befehl cat weiterzuleiten. Führen Sie zunächst den Befehl find mit dem regulären Ausdruck aus und überprüfen Sie die Reihenfolge der Dateien…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Dies gibt die Dateien in der richtigen Reihenfolge aus, so dass Sie überprüfen können, ob sie korrekt sind, oder sie so ändern können, dass sie Ihren Wünschen entsprechen. Sie können diese Ausgabe dann über die Pipeline in den cat-Befehl einfügen.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Wenn Sie mehrere Dateien in eine Datei zusammenführen und dabei reguläre Ausdrücke verwenden, um sie abzugleichen, insbesondere wenn dies über die Pipeline geschieht und die Ausgabedatei nicht sehr offensichtlich ist, stellen Sie sicher, dass der reguläre Ausdruck nicht mit dem Dateinamen der zusammengeführten Datei übereinstimmt. Falls er doch übereinstimmt, ist der Befehl cat normalerweise ziemlich gut darin, mit der Meldung „Eingabedatei ist Ausgabedatei“ einen Fehler zu melden. Aber es hilft, am Anfang vorsichtig zu sein.
Zwei Dateien an beliebiger Stelle zusammenführen
Manchmal möchte man zwei Dateien zusammenführen, aber an einer bestimmten Stelle innerhalb des Inhalts einer Datei. Dies ist eher ein Vorgang, bei dem der Inhalt einer Datei an einer bestimmten Stelle in eine andere Datei eingefügt wird.
Wenn die Dateigrößen klein und überschaubar sind, ist vi ein hervorragendes Editor-Werkzeug für diese Aufgabe. Andernfalls besteht die Möglichkeit, die Datei zuerst zu teilen und dann die resultierenden Dateien der Reihe nach zusammenzufügen. Am einfachsten ist es, die Datei anhand der Zeilennummern aufzuteilen, und zwar genau an der Stelle, an der Sie die andere Datei einfügen möchten.
bash$ split -l 1234 file1.txt
Sie können die Datei je nach Bedarf in eine beliebige Anzahl von Ausgabedateien aufteilen. Im obigen Beispiel wird die Datei file1.txt in Abschnitte von 1234 Zeilen aufgeteilt. Es ist durchaus möglich, dass Sie am Ende mehr als zwei Dateien mit den Namen xaa, xab, xac usw. haben, die Sie mit demselben cat-Befehl wie oben zusammenführen können.
bash$ cat xaa file2.txt xa{b..z}
Der obige Befehl führt die Dateien der Reihe nach zusammen, wobei der Inhalt von file2.txt zwischen dem Inhalt von xaa und xab liegt.
Ein anderer Anwendungsfall ist, wenn Sie nur bestimmte Teile bestimmter Dateien abhängig von einer Bedingung zusammenführen müssen. Dies ist für mich besonders nützlich, wenn ich mehrere große Protokolldateien analysieren muss, aber nur an bestimmten Meldungen oder Zeilen interessiert bin. Ich muss also die wichtigen Log-Meldungen nach bestimmten Kriterien aus mehreren Log-Dateien extrahieren und in einer anderen Datei speichern, wobei die Reihenfolge der Meldungen beibehalten wird.
Das kann man zwar mit den Befehlen cat und grep machen, aber auch nur mit dem Befehl grep.
bash$ grep -h "" logfile*.log > onlyerrors.log
Das obige Beispiel extrahiert alle Zeilen, die dem Muster entsprechen, und speichert sie in einer anderen Datei. Sie müssen sicherstellen, dass die Protokolldateien in der richtigen Reihenfolge sind, wenn Sie den regulären Ausdruck verwenden, um sie abzugleichen, wie bereits in diesem Beitrag erwähnt.