Zwei csv-Files zusammenführen

Erstellt: 30.01.2012 21:58

Will man zwei Tabellen miteinander verbinden ist dies zum Beispiel unter MySQL mit "join" kein Problem.

Hat man zwei CSV-Files ist dies fast genauso einfach, wenn nicht sogar ein wenig leichter!
Dazu gibt es den Befehl "join" aus den GNU-Utils.

Hier ein einfaches und kleines Beispiel. Vorhanden sind zwei Dateien, die eine enthält Orchideen-Genus, die andere Orchideen-Species:

Die 1. Spalte enthält die ID, die 2. Spalte den Genus.

$ cat genus.csv
1;"Orchis"
2;"Epipactis"
3;"Gomphichis"

Die 1. Spalte enthält die ID, 2. Spalte die ID des Genus, 3. Spalte die Species

$ cat species.csv
1;1;"militaris"
2;1;"galilaea"
3;3;"traceyae"
4;3;"macbridei"
5;2;"helleborine"
6;3;"goodyeroides"
7;3;"foliosa"
8;3;"caucana"
9;2;"latifolia"
10;1;"stevenii"

Wichtig für "join" ist, dass die Spalten auf welche die Dateien zusammengesetzt werden sollen sortiert sind, ansonsten gibt es eine Fehlermeldung wie "join: Datei 2 ist nicht sortiert". Deshalb muss die Datei "species.csv" nun zuerst noch nach der 2. Spalte sortiert werden. Um das Beispiel zu vervollständigen wird die erste Datei auch gleich sortiert:

$ join -t";" -1 1 -2 2 <(sort genus.csv -t";" -n -k1 )   <(sort species.csv -t";" -n -k2)
1;"Orchis";10;"stevenii"
1;"Orchis";1;"militaris"
1;"Orchis";2;"galilaea"
2;"Epipactis";5;"helleborine"
2;"Epipactis";9;"latifolia"
3;"Gomphichis";3;"traceyae"
3;"Gomphichis";4;"macbridei"
3;"Gomphichis";6;"goodyeroides"
3;"Gomphichis";7;"foliosa"
3;"Gomphichis";8;"caucana"

Join:
-t";" gibt das Semilikon als Delemiterzeichen an.
-1 1 bedeutet, dass von der ersten Datei die erste Spalte benutzt wird.
-2 2 bedeutet, dass von der zweiten Datei die zweite Spalte benutzt wird.

Sort:
-t"; gibt das Semilikon als wiederum das Delemiterzeichen an.
-n steht für nummerische Sortierung.
-kN sortiert nach der Spalte N.

Es ist auch möglich einzelne Spalten auszuwählen:

$ join -t";" -1 1 -2 2 <(sort genus.csv -t";" -n -k1 )   <(sort species.csv -t";" -n -k2) -o 1.2,2.3
"Orchis";"stevenii"
"Orchis";"militaris"
"Orchis";"galilaea"
"Epipactis";"helleborine"
"Epipactis";"latifolia"
"Gomphichis";"traceyae"
"Gomphichis";"macbridei"
"Gomphichis";"goodyeroides"
"Gomphichis";"foliosa"
"Gomphichis";"caucana"

-o ermöglicht die Ausgabe zu definieren im Format F.N (F steht hier für die Dateinummer, N für die Spaltennummer), getrennt durch Kommas.

Andere nützliche Optionen zum Verhalten bei fehlenden Feldern oder nicht passenden Zeilen kann man natürlich der man-Page entnehmen.

Tagged: Bash Linux Tools


Ähnliche Artikel:
Markdown-Files unter Linux im Terminal darstellen
Bearbeitungsdatum einer Datei manipulieren
In Bash einen String aus HTML/XML-Tags extrahieren
Einzelnen Befehl mit su als anderer User ausführen
Zeilen mir mehr als ... Zeichen finden

« Vorheriger Eintrag

Nächster Eintrag »

Kommentare

Verfasse den ersten Kommentar!

Kommentar verfassen