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.