2016-07-08 14 views
1

ich zwei Dateien haben, die wie folgt aussehen:Bash kommen über mehrere Felder

file1

a b 1 1 
b d 2 3 

file2

a 10 11 
b 20 21 
d 30 31 

Und ich möchte ihnen verbinden, um folgendes zu haben Ausgabe, die die erste Datei ist mit dem, was in Datei2 für die ersten beiden Felder geschrieben wird:

a b 1 1 10 11 20 21 
b d 2 3 20 21 30 31 

Ich habe versucht, Join zu verwenden, aber ich kann Dateien nicht gemäß den ersten beiden Feldern von file1 verbinden.

+0

Beantwortet hunderte Male, awk Einsatz. – 123

+0

Keine Möglichkeit, dies nur mit Join zu tun? – pauloss

+0

Nicht, dass ich keine Ahnung habe. – 123

Antwort

3

Da Sie auf zwei Leitungen anschließen möchten, werden Sie zweimal beitreten müssen, kochend die stdout von der ersten bis zur stdin des zweiten:

join -11 -21 file1 file2 | join -12 -21 - file2 

Edit: Ah schießen, das kehrt die Reihenfolge der ersten beiden Felder, ist das ok?

b a 1 1 10 11 20 21 
d b 2 3 20 21 30 31 

Edit 2: Dies könnte besser sein - wenn Sie die Reihenfolge der Joins umkehren, Sie werden die ersten beiden Spalten in der richtigen Reihenfolge zu bekommen, aber die verknüpften Spalten vertauscht werden:

join -12 -21 file1 file2 | join -12 -21 - file2 

Ausbeuten:

a b 1 1 20 21 10 11 
b d 2 3 30 31 20 21 

Heh ok ich denke, wir es bekam - bearbeiten 3 mit Vorschlag von Michael Vehrs:

join -11 -21 file1 file2 | join -o "1.1 1.2 1.3 1.4 1.5 1.6 2.2 2.3" -12 -21 - file2 

Ausbeuten:

a b 1 1 10 11 20 21 
b d 2 3 20 21 30 31 
+0

Ich möchte wirklich die Bestellung behalten. Ich habe diese 'join -11 -21 t1 t2 | beitreten -12 -21 - t2 | awk '{print $ 2' "$ 1" "$ 3" "$ 4" "$ 5" "$ 6" "$ 7" "$ 8}" aber ich habe das Gefühl, dass es eine bessere Option gibt. – pauloss

+0

Ihre zweite Änderung invertiert die Werte von a und b anstelle von a und b. – pauloss

+1

Es ist tollpatschig, aber Sie können die Reihenfolge der Felder mit der Option "-o" korrigieren, zumindest mit GNU 'Join'. –