Linux / Befehl join: Dateien nach einem gemeinsamen Feld kombinieren
join kombiniert Zeilen mit demselben Schlüsselwert aus zwei Textdateien zu einer einzelnen Zeile. Der Unterschied zu paste besteht darin, dass es basierend auf Feldwerten verknüpft, nicht nach Zeilennummern.
Standardmäßig verwendet es das erste Feld jeder Datei als Schlüssel, und beide Dateien müssen nach diesem Schlüssel sortiert sein. Das Standardverhalten besteht darin, nur übereinstimmende Zeilen auszugeben. Um auch nach fehlenden Schlüsseln zu suchen, überprüfen Sie die Optionen von -a oder -v.
Grundlegende Syntax
join [option] file1 file2
Installierte Implementierungen und Optionen können je nach Distribution variieren. Überprüfen Sie die Beschreibung Ihres Systems mit man join.
Vorbereiten, sortieren, verknüpfen und nicht übereinstimmende Zeilen überprüfen
Führen Sie den gesamten Block aus: Er bereitet jede Eingabe in einem neuen temporären Verzeichnis innerhalb eines Subshells vor und gibt dieses Verzeichnis am Ende aus. Er überschreibt keine Dateien im aktuellen Arbeitsverzeichnis. Prüfen Sie die Ergebnisse und entfernen Sie die Labordaten nur, wenn sie nicht mehr benötigt werden.
( set -eu labdir=$(mktemp -d) cd "$labdir" printf 'b Bob a Ana c Cat ' > names.txt printf 'a 7 b 12 ' > scores.txt LC_ALL=C sort -k1,1 names.txt > names.sorted LC_ALL=C sort -k1,1 scores.txt > scores.sorted LC_ALL=C join --check-order names.sorted scores.sorted LC_ALL=C join --check-order -a 1 names.sorted scores.sorted printf 'a:Ana b:Bob ' > users.txt printf 'a:reader b:writer ' > roles.txt LC_ALL=C sort -t ':' -k1,1 users.txt > users.sorted LC_ALL=C sort -t ':' -k1,1 roles.txt > roles.sorted LC_ALL=C join --check-order -t ':' users.sorted roles.sorted printf 'Lab files: %s\n' "$labdir" )
Die erste Verknüpfung gibt a Ana 7 und b Bob 12 aus. Mit -a 1 wird auch c Cat ohne Punktzahl beibehalten. Das Doppelpunkt-Beispiel gibt a:Ana:reader und b:Bob:writer aus. Schlüssel werden als Zeichenketten verglichen und sowohl sort als auch join verwenden LC_ALL=C. Doppelte Schlüssel können jede passende Zeilenkombination erzeugen, kein Eins-zu-Eins-Join. Verwenden Sie keine Teilausgabe eines fehlgeschlagenen --check-order-Laufs als abgeschlossenes Ergebnis.
Hauptoptionen und Format
| Optionen/Format | Beschreibung |
|---|---|
-t character |
Gibt das Eingabe-/Ausgabefeldtrennzeichen an. |
-1 N / -2 N |
Gibt die Zusammenführungsschlüsselfelder für die erste und zweite Datei an. |
-a 1 or -a 2 |
Gibt auch nicht übereinstimmende Zeilen aus der angegebenen Datei aus. |
-v 1 or -v 2 |
Gibt nur nicht übereinstimmende Zeilen aus der angegebenen Datei aus. |
-o format |
Gibt die Ausgabefelder und deren Reihenfolge an. |
Vorsichtsmaßnahmen bei der Verwendung
Beide Dateien müssen nach demselben Schlüssel, Trennzeichen und Gebietsschema sortiert sein. Unsortierte Eingaben können zu fehlenden oder falsch kombinierten Einträgen führen. Wenn ein Schlüssel doppelt vorkommt, können mehrere Ausgabereihen für einen einzelnen Schlüssel erzeugt werden, daher sollte die resultierende Anzahl überprüft werden.
Häufig gestellte Fragen
Kann eine unsortierte Datei direkt zusammengeführt werden?
Die übliche join-Operation erfordert, dass beide Dateien nach dem Verknüpfungsfeld sortiert sind. Erstellen Sie vor dem Ausführen eine Kopie mit übereinstimmender Sortierreihenfolge und Gebietsschema.
Offizielle Dokumentation
Das genaue Verhalten der Optionen und die Unterschiede zwischen Implementierungen finden Sie in der offiziellen Dokumentation für join.




