join (Unix)

Van Wikipedia, de gratis encyclopedie

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.