Join (Unix)
# Join (Unix)

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 festgelegt, darüber hinaus gelten die allgemeinen Regeln für das Verhalten von Kommandozeilen-Utilities. 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):

## 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:
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):
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:
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:
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: