Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

join - Zwei Dateien nach Vergleichsfeldern verbinden

&pagelevel(4)&pagelevel

(relational database operator)


join vergleicht zwei Dateien nach Vergleichsfeldern und verbindet alle Zeilenpaare, deren Vergleichsfeld identisch ist. Das Ergebnis gibt join auf die Standard-Ausgabe aus.

Beim join-Aufruf legen Sie für jede der beiden Dateien fest, welches Feld das Vergleichsfeld sein soll. Ein Feld wird von zwei Feldtrennzeichen begrenzt. join vergleicht jede Zeile der ersten Datei mit den Zeilen der zweiten Datei. Für jedes Zeilenpaar mit identischem Vergleichsfeld gibt join auf die Standard-Ausgabe eine Ausgabezeile aus, die sich aus bestimmten Feldern beider Zeilen zusammensetzt.

Vor dem Aufruf beachten

Jede Eingabedatei muss in ihrem Vergleichsfeld gemäß der gültigen Sortier-Reihenfolge sortiert sein (siehe sort). Bei Standard-Feldtrennung (join ohne Option -t) dürfen beim Sortieren führende Feldtrennzeichen nicht berücksichtigt werden (siehe sort, Option -b). Geben Sie dagegen join mit Option -t an, müssen Sie führende Trennzeichen beim Sortieren berücksichtigen (siehe sort ohne Option -b).


Syntax


Format 1:join[ -a n| -v n][ -e zeichenkette]
    [ -o liste][ -t c]
    [ -1 feld][ -2 feld] datei1 datei2
Format 2:join[ -a n][-e zeichenkette]
    [-j feld][-j1 feld][-j2 feld]
    [ -o liste...][ -t c] datei1 datei2

Die Formate werden gemeinsam beschrieben, da die Option -j field in Format 2 den Optionen -1 feld -2 feld in Format 1 entspricht. -j1 feld ist äquivalent zu -1 feld und -j2 feld ist äquivalent zu -2 feld.

Keine Option angegeben

Vergleichsfeld für beide Dateien ist das erste Feld. Feldtrennzeichen für die Eingabezeilen sind Leerzeichen, Tabulatorzeichen und Neue-Zeile-Zeichen. Aufeinanderfolgende Feldtrennzeichen werden als ein einziges Feldtrennzeichen interpretiert; führende Feldtrennzeichen werden ignoriert.

Für jedes Zeilenpaar mit identischem Vergleichsfeld gibt join auf die Standard-Ausgabe eine Ausgabezeile aus. Diese Ausgabezeile enthält in dieser Reihenfolge:

  • das gemeinsame Vergleichsfeld

  • den Rest der Eingabezeile aus der ersten Datei

  • den Rest der Eingabezeile aus der zweiten Datei.

Die Felder der Ausgabezeilen sind durch ein Leerzeichen voneinander getrennt.

-a n

(a - additional output)

join gibt zusätzlich zur normalen Ausgabe alle Zeilen der n-ten Eingabedatei aus, deren Vergleichsfeld mit keinem Vergleichsfeld der anderen Datei übereinstimmt. Für n können Sie 1 oder 2 angeben. Soll die Ausgabe für beide Vergleichsdateien erfolgen, dann geben Sie -a 1 -a 2 an.

Die Option -a darf nicht zusammen mit der Option -v angegeben werden.

-v n

Statt der Standardausgabe wird für jede Zeile in n ohne Entsprechung eine Zeile erzeugt. n kann 1 oder 2 sein. Wenn sowohl -v 1 als auch -v 2 angegeben wird, werden alle Zeilen ohne Entsprechung ausgegeben.

-e zeichenkette

(e - empty output fields)

join ersetzt leere Ausgabefelder durch die angegebene Zeichenkette.

-j[n] m

Als Vergleichsfeld für die n-te Datei wird das m-te Feld festgelegt. Für n können Sie 1 oder 2 angeben, für m eine ganze Zahl größer gleich 1.

Wenn Sie für die andere Datei keine Option -j angeben, dann ist das Vergleichsfeld für diese andere Datei das 1. Feld.

n nicht angegeben:
Vergleichsfeld für beide Dateien ist das m-te Feld.

-j nicht angegeben:
Vergleichsfeld für beide Dateien ist das 1. Feld.

-o liste

(o - output format)

join ändert das Format der Ausgabezeilen: Die Ausgabezeilen enthalten dann der Reihe nach die in liste angegebenen Felder. Das gemeinsame Vergleichsfeld wird nur dann ausgegeben, wenn Sie es ausdrücklich in liste angegeben haben.

Für liste geben Sie eine Liste an, die aus Elementen der Form n.m besteht, wobei n gleich 1 oder 2 und m größer gleich 1 ist. Ein Element n.m steht für das m-te Feld der n-ten Datei. Die Elemente trennen Sie durch Leer- oder Tabulatorzeichen.

-t c

Das Zeichen c wird als Feldtrennzeichen sowohl für die Eingabe- als auch für die Ausgabezeilen definiert. Jedes Vorkommen von c wird als Feldtrennzeichen interpretiert, d.h.

  • zwei aufeinanderfolgende c kennzeichnen ein leeres Feld und

  • ein führendes c kennzeichnet ein leeres erstes Feld.

Zusätzlich ist das Neue-Zeile-Zeichen Feldtrennzeichen für die Eingabezeilen.

Die Standard-Feldtrennzeichen Leer- und Tabulatorzeichen werden nur dann als Feldtrennzeichen interpretiert, wenn Sie diese Zeichen für c angeben.

-1 feld

Verbindet das Feld feld aus Datei 1. Felder sind dezimale Ganzzahlen ab 1.

-2 feld

Verbindet das Feld feld aus Datei 2. Felder sind dezimale Ganzzahlen ab 1.

datei1 datei2

Namen der beiden Dateien, die join nach Vergleichsfeldern verbinden soll.
Wenn Sie für datei1 einen Bindestrich - angeben, liest join von der Standard-Eingabe.


Wenn die Dateien nicht nach ihrem Vergleichsfeld sortiert sind, dann bearbeitet join nicht alle Zeilen!

Wenn Sie für datei1 einen numerischen Dateinamen (z.B. 1.2) angeben und diesem Dateinamen die Option -o unmittelbar voranstellen, dann kann das zu Problemen führen. Wenn Sie also einen numerischen Dateinamen angeben wollen, dann geben Sie ihn mit Schrägstrich (z.B. ./1.2) an.

Internationale Umgebung

Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos join:

LANG

Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.

LC_ALL

Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.

LC_COLLATE

Beeinflusst die Sortierreihenfolge.

LC_CTYPE

Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedateien) sowie die Einteilung der Zeichen in Groß- und Kleinbuchstaben und deren Übereinstimmung.

LC_MESSAGES

Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.

NLSPATH

Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.

Beispiel 1

In der Datei ort ist einem Namen ein Ort zugeordnet, in der Datei betrag sind denselben Namen je ein Betrag und ein Datum zugeordnet. Beide Dateien sind nach den Namen sortiert. join soll beide Dateien nach den Namen verbinden.

Inhalt der Datei ort:

Albert München
Hugo Stuttgart
Ilse Hamburg

Inhalt der Datei betrag:

Albert   287.56  20.03.94
Hugo      23.15  25.06.93
Hugo     167.87  16.12.93
Ilse    1212.12  12.12.94
Ilse       1.98  01.01.94

Verbinden der beiden Dateien nach dem ersten Vergleichsfeld:

$ join ort betrag
Albert Muenchen 287.56 20.03.94

Hugo Stuttgart 23.15 25.06.93

Hugo Stuttgart 167.87 16.12.93

Ilse Hamburg 1212.12 12.12.94

Ilse Hamburg 1.98 01.01.94

Verbinden der beiden Dateien und spaltenweise formatieren mit awk:

$ join ort betrag | awk '{printf("%-10s %-15s %-10s %-10s\n",$1,$2,$3,$4)}'

Albert    Muenchen       287.56    20.03.94
Hugo      Stuttgart       23.15    25.06.93

Hugo      Stuttgart      167.87    16.12.93

Ilse      Hamburg       1212.12    12.12.94
Ilse      Hamburg          1.98    01.01.94

Beispiel 2

In der Datei stadt ist einer Stadt ein Name zugeordnet, in der Datei betrag (siehe Beispiel 1) ist einem Namen ein Betrag und ein Datum zugeordnet. Die Datei stadt ist nach den Städten, die Datei betrag nach den Namen sortiert. join soll beide Dateien nach den Namen verbinden.

Inhalt der Datei stadt:

Augsburg     Egon
Hamburg      Ilse
Muenchen     Albert
Muenchen     Franz
Stuttgart    Hugo

Vergleichsfeld für die Datei stadt ist das 2. Feld, für die Datei betrag das 1. Feld.
Bevor Sie die Dateien verbinden, müssen Sie die Datei stadt nach dem 2. Feld sortieren. Formatieren Sie anschließend wieder spaltenweise mit awk:

$ sort -b +1 stadt | join -j1 2 - betrag | \
> awk '{printf("%-10s %-15s %-10s %-10s\n",$1,$2,$3,$4)}'

Albert     Muenchen        287.56     20.03.94

Hugo       Stuttgart       23.15      25.06.93

Hugo       Stuttgart       167.87     16.12.93
Ilse       Hamburg         1212.12    12.12.94

Ilse       Hamburg         1.98       01.01.94

Siehe auch

awk, comm, sort, uniq