it-swarm.com.de

Wie werden zwei Dateien mit AWK zusammengeführt?

Datei 1 hat 5 Felder A B C D E, wobei Feld A ein ganzzahliger Wert ist

Datei 2 hat 3 Felder A F G

Die Anzahl der Zeilen in Datei 1 ist viel größer als die von Datei 2 (20 ^ 6 bis 5000).

Alle Einträge von A in Datei 1 erschienen in Feld A in Datei 2

Ich mag es, die beiden Dateien nach Feld A zusammenzuführen und F und G zu tragen

Gewünschte Ausgabe ist A B C D E F G

Beispiel

Datei 1

 A     B     C    D    E
4050 S00001 31228 3286 0
4050 S00012 31227 4251 0
4049 S00001 28342 3021 1
4048 S00001 46578 4210 0
4048 S00113 31221 4250 0
4047 S00122 31225 4249 0
4046 S00344 31322 4000 1

Datei 2

A     F    G   
4050 12.1 23.6
4049 14.4 47.8   
4048 23.2 43.9
4047 45.5 21.6

Gewünschte Ausgabe

A    B      C      D   E F    G
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
31
Tony
$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
4046 S00344 31322 4000 1
36
kurumi

Zum Glück müssen Sie das überhaupt nicht schreiben. Unix hat einen Join-Befehl, der dies für Sie erledigt.

join -1 1 -2 1 File1 File2

Hier ist es "in Aktion":

will-hartungs-computer:tmp will$ cat f1
4050 S00001 31228 3286 0
4050 S00012 31227 4251 0
4049 S00001 28342 3021 1
4048 S00001 46578 4210 0
4048 S00113 31221 4250 0
4047 S00122 31225 4249 0
4046 S00344 31322 4000 1
will-hartungs-computer:tmp will$ cat f2
4050 12.1 23.6
4049 14.4 47.8   
4048 23.2 43.9
4047 45.5 21.6
will-hartungs-computer:tmp will$ join -1 1 -2 1 f1 f2
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
will-hartungs-computer:tmp will$ 
26
Will Hartung

Sie müssen die Einträge aus Datei 2 in ein Paar assoziativer Arrays im BEGIN-Block lesen. Angenommen, GNU Awk:

BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }

Im Hauptverarbeitungsblock lesen Sie die Zeile aus Datei 1 und drucken sie mit den korrekten Daten aus den Arrays, die im BEGIN-Block erstellt wurden:

{ print $0, f[$1], g[$1] }

Geben Sie Datei 1 als Dateinamenargument für das Programm an.

awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
     print $0, f[$1], g[$1] }' "File 1"

Die Anführungszeichen um das Dateinamenargument werden aufgrund der Leerzeichen im Dateinamen benötigt. Sie benötigen die Anführungszeichen um den Dateinamen getline, auch wenn dieser keine Leerzeichen enthält, da es sich sonst um einen Variablennamen handelt.

5