join (Unix)

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. The Open Group Base Specifications. Nr. 7, IEEE Std 1003.1, 2013 Edition.
  2. Utility Conventions 12.1 Utility Argument Syntax. In: The Open Group Base Specifications. Nr. 7, 2013.
  3. Utility Conventions 12.2 Utility Syntax Guidelines. In: The Open Group Base Specifications. Nr. 7, 2013.