join (/bin/join
) ist ein Computerprogramm zum Erzeugen einer Ausgabe aus zwei zusammengeführten (record-orientierten) Eingangsdatenströmen, ähnlich den verschiedenen Varianten der SQL-Operation JOIN
. Als Input werden zwei bereits sortiert vorliegende Datenströme (Files, Ausgaben von Subprozessen, Ergebnisse von Prozesssubstitutionen oder sonstiger Input auf stdin
) erwartet, die Ausgabe erfolgt auf stdout
.
Das Verhalten von join
ist für UNIX-Systeme im Einzelnen durch den POSIX-Standard[1] festgelegt, darüber hinaus gelten die allgemeinen Regeln für das Verhalten von Kommandozeilen-Utilities.[2][3] Das Kommando ist auf UNIX-Systemen und anderen POSIX-konformen Systemen vorgeschrieben, auch viele Nonstandard-Betriebssysteme weisen ein gleich oder ähnlich arbeitendes Kommando auf.
Anwendung
join
wird dazu verwendet, Informationen aus mehreren Eingangsdatenbeständen miteinander zu verknüpfen und das Ergebnis dieser Verknüpfung auszugeben. Vom Input wird dabei eine Record-Struktur erwartet: eine tabellenartige Struktur, in welcher durch newline
getrennte Zeilen aus durch jeweils ein Field Separator-Zeichen getrennten Spalten (Fields) bestehen. Dies sind zum Beispiel Dateien im CSV-Format, aber auch andere, ähnlich strukturierte.
Ebenso wird vom Input erwartet, dass er bereits sortiert vorliegt! Ein häufig gemachter Fehler bei der Verwendung von join
besteht darin, diese Sortierung zu vergessen.
Falls ein Record der einen Datei mehreren Records der anderen Datei entspricht, dann wird die Information dieses Records so oft wie notwendig dupliziert (also analog einem outer join):
A:
f1 a
f1 b
f1 c
B:
f1 X
Ergebnis:
f1 a X
f1 b X
f1 c X
Beispiel
Aus einer Liste von Telefonnummern und einer von Fax-Nummern soll eine Liste mit beiden Informationen erstellt werden. Die Dateien tel
mit den Telefonnummern und fax
mit den Fax-Nummern (die großen Leerräume der Field Separators sind dabei Tabulatorzeichen) seien folgenden Inhalts:
>Name Tel-Nummer
Anna 123456-123
Karl 123456-456
Sandra 123457-789
>Name Fax-Nummer
Anna 345678-997
Leo 345679-998
Sandra 345678-999
Der naive Aufruf würde nun über die jeweils ersten Felder (also die Namen) verbinden und nur die Werte, die in beiden Dateien vorkommen, ausgeben (inner join):
# join tel fax
>Name Tel-Nummer Fax-Nummer
Anna 123456-123 345678-997
Sandra 123457-789 345678-999
Hingegen wird die Ausgabe deutlich ansprechender durch die Angabe des Separators (-t
, <tab>
ist dabei ein literales Tabulatorzeichen) und eine Formatangabe für die Ausgabe (-o
) formatiert. Der Field Separator wird dabei sowohl für Ein- wie auch Ausgabe verwendet:
# join -t'<tab>' -o 0,1.2,2.2 tel fax
>Name Tel-Nummer Fax-Nummer
Anna 123456-123 345678-997
Sandra 123457-789 345678-999
Außerdem kann das Standard-Verhalten (inner join) auch auf Inklusion nicht in beiden Dateien vorkommender Schlüsselbegriffe umgestellt (-a
) und ein Standardtext für die jeweils fehlenden Informationen (-e
) vorgegeben werden:
# join -t'<tab>' -a 1 -a 2 -e '(keine)' -o 0,1.2,2.2 tel fax
>Name Tel-Nummer Fax-Nummer
Anna 123456-123 345678-997
Karl 123456-456 (keine)
Leo (keine) 345679-998
Sandra 123457-789 345678-999
Zuletzt kann das Verhalten invertiert werden, sodass lediglich jene Records in der Ausgabe erscheinen, welche keine Entsprechungen in beiden Dateien haben (-v
). Das Ergebnis ist eine Liste von Personen, die entweder kein Fax oder kein Telefon haben:
# join -t'<tab>' -v 1 -v 2 -o 0 tel fax
Karl
Leo
Weblinks
Einzelnachweise
- ↑ The Open Group Base Specifications. Nr. 7, IEEE Std 1003.1, 2013 Edition.
- ↑ Utility Conventions 12.1 Utility Argument Syntax. In: The Open Group Base Specifications. Nr. 7, 2013.
- ↑ Utility Conventions 12.2 Utility Syntax Guidelines. In: The Open Group Base Specifications. Nr. 7, 2013.