Zusammenführen und Sortieren von Dateien unter Linux

, Author

Es gibt eine Reihe von Möglichkeiten, Textdateien unter Linux zusammenzuführen und zu sortieren, aber wie man dabei vorgeht, hängt davon ab, was man erreichen will – ob man einfach den Inhalt mehrerer Dateien in einer großen Datei zusammenfassen oder ihn auf eine Weise organisieren will, die die Benutzung erleichtert. In diesem Beitrag werden wir uns einige Befehle zum Sortieren und Zusammenführen von Dateiinhalten ansehen und uns darauf konzentrieren, wie sich die Ergebnisse unterscheiden.

Verwenden von cat

Wenn Sie nur eine Gruppe von Dateien in einer einzigen Datei zusammenfassen wollen, ist der Befehl cat eine einfache Wahl. Sie brauchen nur „cat“ einzugeben und die Dateien in der Befehlszeile in der Reihenfolge aufzulisten, in der sie in die zusammengefasste Datei aufgenommen werden sollen. Leiten Sie die Ausgabe des Befehls in die Datei um, die Sie erstellen möchten. Wenn eine Datei mit dem angegebenen Namen bereits existiert, wird sie durch die zu erstellende Datei überschrieben. Beispiel:

$ cat firstfile secondfile thirdfile > newfile

Wenn Sie den Inhalt einer Reihe von Dateien zu einer bestehenden Datei hinzufügen wollen, anstatt sie zu überschreiben, ändern Sie einfach > in >>.

$ cat firstfile secondfile thirdfile >> updated_file

Wenn die Dateien, die Sie zusammenführen wollen, einer geeigneten Namenskonvention folgen, kann die Aufgabe noch einfacher sein. Sie müssen nicht alle Dateinamen einbeziehen, wenn Sie sie mit einem regulären Ausdruck angeben können. Wenn zum Beispiel alle Dateien mit dem Wort „file“ enden, wie im obigen Beispiel, könnten Sie etwa so vorgehen:

$ cat *file > allfiles

Beachten Sie, dass der oben gezeigte Befehl die Dateiinhalte in alphanumerischer Reihenfolge hinzufügt. Unter Linux würde eine Datei namens „filea“ vor einer Datei namens „fileA“, aber nach einer Datei namens „file7“ hinzugefügt. Schließlich müssen wir nicht nur an „ABCDE“ denken, wenn wir es mit einer alphanumerischen Folge zu tun haben, sondern auch an „0123456789aAbBcCdDeE“. Sie können immer einen Befehl wie „ls *Datei“ verwenden, um die Reihenfolge zu sehen, in der die Dateien hinzugefügt werden, bevor sie zusammengeführt werden.

HINWEIS: Es ist eine gute Idee, zuerst sicherzustellen, dass Ihr Befehl alle Dateien enthält, die Sie in der zusammengeführten Datei haben wollen, und keine anderen – besonders wenn Sie einen Platzhalter wie „*“ verwenden. Und vergessen Sie nicht, dass die zusammengeführten Dateien immer noch als separate Dateien existieren, die Sie möglicherweise löschen möchten, sobald die Zusammenführung verifiziert wurde.

Dateien nach Alter zusammenführen

Wenn Sie Ihre Dateien auf der Grundlage des Alters der einzelnen Dateien zusammenführen möchten, anstatt nach Dateinamen, verwenden Sie einen Befehl wie diesen:

$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done

Die Verwendung der Optionen -tr (t=time, r=reverse) führt zu einer Liste der Dateien in der Reihenfolge des ältesten Alters. Dies kann z.B. nützlich sein, wenn Sie ein Protokoll über bestimmte Aktivitäten führen und den Inhalt in der Reihenfolge hinzufügen möchten, in der die Aktivitäten durchgeführt wurden.

Das $$ im obigen Befehl stellt die Prozess-ID für den Befehl dar, wenn Sie ihn ausführen. Es ist völlig unnötig, dies zu verwenden, aber es macht es fast unmöglich, dass Sie versehentlich an das Ende einer bestehenden Datei anfügen, anstatt eine neue zu erstellen. Wenn Sie $$ verwenden, könnte die resultierende Datei so aussehen:

$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914

Zusammenführen und Sortieren von Dateien

Linux bietet einige interessante Möglichkeiten, den Inhalt von Dateien vor oder nach dem Zusammenführen zu sortieren.

Inhalt alphabetisch sortieren

Wenn Sie möchten, dass der Inhalt der zusammengeführten Datei sortiert wird, können Sie den gesamten Inhalt mit einem Befehl wie diesem sortieren:

$ cat myfile.1 myfile.2 myfile.3 | sort > newfile

Wenn Sie den Inhalt nach Dateien gruppiert lassen möchten, sortieren Sie jede Datei, bevor Sie sie der neuen Datei hinzufügen, mit einem Befehl wie diesem:

$ for file in `ls myfile.?`; do sort $file >> newfile; done

Dateien numerisch sortieren

Um den Inhalt der Dateien numerisch zu sortieren, verwenden Sie die Option -n mit sort. Diese Option ist nur sinnvoll, wenn die Zeilen in Ihren Dateien mit Zahlen beginnen. Beachten Sie, dass in der Standardreihenfolge „02“ als kleiner als „1“ angesehen wird. Verwenden Sie die Option -n, wenn Sie sicherstellen wollen, dass die Zeilen in numerischer Reihenfolge sortiert werden.

$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz

Mit der Option -n können Sie den Dateiinhalt auch nach Datum sortieren, wenn die Zeilen in den Dateien mit Datumsangaben in einem Format wie „2020-11-03“ oder „2020/11/03“ (Format Jahr, Monat, Tag) beginnen. Das Sortieren nach Datumsangaben in anderen Formaten ist schwierig und erfordert weitaus komplexere Befehle.

Verwenden von paste

Mit dem Befehl paste können Sie den Inhalt von Dateien zeilenweise zusammenfügen. Wenn Sie diesen Befehl verwenden, enthält die erste Zeile der zusammengefügten Datei die erste Zeile jeder der zusammengefügten Dateien. Hier ein Beispiel, bei dem ich Großbuchstaben verwendet habe, damit Sie leicht erkennen können, woher die Zeilen stammen:

$ cat file.aA oneA twoA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C thee B four C four C five

Leiten Sie die Ausgabe in eine andere Datei um, um sie zu speichern:

$ paste file.a file.b file.c > merged_content

Alternativ können Sie Dateien so zusammenfügen, dass der Inhalt jeder Datei in einer einzigen Zeile zusammengefasst wird. Dazu müssen Sie die Option -s (sequentiell) verwenden. Beachten Sie, dass die Ausgabe diesmal den Inhalt der einzelnen Dateien zeigt:

$ paste -s file.a file.b file.cA one A two A threeB one B two B three B fourC one C two C thee C four C five

Verwenden von join

Ein weiterer Befehl zum Zusammenführen von Dateien ist join. Mit dem Befehl join können Sie den Inhalt mehrerer Dateien auf der Grundlage eines gemeinsamen Feldes zusammenführen. Sie könnten beispielsweise eine Datei mit den Telefonnummern einer Gruppe von Mitarbeitern haben und eine andere mit deren persönlichen E-Mail-Adressen, die beide nach den Namen der Personen aufgelistet sind. Sie können join verwenden, um eine Datei mit Telefonnummern und E-Mail-Adressen zu erstellen.

Eine wichtige Einschränkung ist, dass die Zeilen der Dateien in der gleichen Reihenfolge aufgelistet sein müssen und das join-Feld in jeder Datei enthalten sein muss.

Hier ist ein Beispielbefehl:

$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]

In diesem Beispiel muss das erste Feld (Vornamen) in jeder Datei vorhanden sein, auch wenn die zusätzlichen Informationen fehlen, sonst schlägt der Befehl mit einem Fehler fehl. Eine Sortierung des Inhalts ist hilfreich und wahrscheinlich viel einfacher zu handhaben, ist aber nicht erforderlich, solange die Reihenfolge konsistent ist.

Wrap-Up

Unter Linux gibt es viele Möglichkeiten, Daten, die in separaten Dateien gespeichert sind, zusammenzuführen und zu sortieren. Die Auswahlmöglichkeiten können einige ansonsten mühsame Aufgaben überraschend einfach machen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.