it-swarm.com.de

Dateien in einer gemeinsamen Spalte zusammenführen

Ich habe zwei Dateien, aus denen ich eine dritte erstellen möchte, die alle Informationen enthält.

datei 1:

a 111 
b 222 
c 333 
d 666 
e 777 

datei 2:

111 x1  
222 x2
333 x3
444 x4 
555 x5 
666 x6 
777 x7 
888 x8

Ich möchte sie wie folgt kombinieren:

111  x1  a
222  x2  b
333  x3  c
444  x4  0
555  x5  0
666  x6  d
777  x7  e
888  x8  0

Hinweis:

Die zweite Spalte von Datei 1 ist eine Teilmenge der ersten Spalte von Datei 2

8
gforce89

Der Befehl join erledigt fast das, was Sie brauchen, wenn die Dateien wie in Ihren Beispielen sortiert sind:

join -12 -a2 file1 file2 -o2.1,2.2,1.1

Sie müssen nur die Nullen zu den Zeilen ohne Übereinstimmung hinzufügen. Sie können dafür den Schalter -e verwenden:

join -12 -a2 file1 file2  -o2.1,2.2,1.1 -e0
7
choroba

Join verwenden:

join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1

Der Befehl join verbindet die Zeilen zweier Dateien, die sich ein gemeinsames Datenfeld teilen. In diesem Fall: Fügen Sie die Datei2 und die Datei1 über das Feld 1 (-1 1) der Datei2 und das Feld 2 (-2 2) der Datei1 zusammen.

Die Ausgabe lautet: "verknüpftes Feld, Feld 2 von Datei2, Feld 1 von Datei1" (-o'0,1.2,2.1'), wenn ein fehlendes Feld vorhanden ist, setzen Sie 0 (-e0)

Wenn eine der beiden Dateien mehr Datensätze enthält, fügen Sie diese hinzu (in diesem Fall Datei2) (-a1).

Weitere Informationen finden Sie auf der Manpage des Befehls join

12
LilloX

Ein bisschen awk Magie:

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
    printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
    file1 file2

oder

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
    print $1,$2,a[$1]}' file1 file2

Ausgabe

111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

Erklärung

  • FNR==NR{a[$2]=$1;next}

    Läuft über file1 (FNR==NR) und erstellt eine Schlüsselwertstruktur. Der Schlüssel ist die zweite Spalte ($2) von file1, der Wert ist die erste Spalte ($1) von file1

  • {if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}

    Läuft über file2 und

    • if(a[$1]==""){a[$1]=0}

      Wenn der Schlüssel in der ersten Spalte ($1) in file2 in file1 nicht vorhanden ist, benötigen wir einen 0

    • print $1,$2,a[$1]

      Drucken Sie (unter Verwendung von print) die erste und die zweite Spalte von file2 und den Wert der Schlüsselwertstruktur mit dem Schlüssel der ersten Spalte ($1) von file2

      oder

    • printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'

      Drucken Sie (unter Verwendung von printf) die erste und die zweite Spalte von file2 und den Wert der Schlüsselwertstruktur mit dem Schlüssel der ersten Spalte ($1) von file2 .

      • FS ist das Trennzeichen zwischen den Spalten aus der Eingabedatei

      • "%s%s%s%s%s\n"

        ist die Formatierung für die Ausgabe

        • %s - Zeichenfolge

        • \n - Newline

5
A.B.

Mit q :

$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

Auf diese Weise kann es manchmal besser lesbar sein.

1
Vi.