awk
Zwei-Datei-Verarbeitung
Suche…
Überprüfen Sie übereinstimmende Felder in zwei Dateien
In Anbetracht dieser zwei CSV-Dateien:
$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6
Um diese Zeilen in file2 zu drucken, deren zweite Spalte auch in der ersten Datei vorkommt, können wir sagen:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4
lines[] enthält hier ein Array, das beim Lesen von file1 mit dem Inhalt des zweiten Felds jeder Zeile file1 wird.
Dann prüft die Bedingung $2 in lines für jede Zeile in file2 , ob das zweite Feld im Array vorhanden ist. Wenn ja, ist die Bedingung wahr und awk führt die Standardaktion aus, die aus dem Drucken der gesamten Zeile besteht.
Wenn nur ein Feld gedruckt werden muss, kann dies der Ausdruck sein:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2
Drucken Sie awk-Variablen, wenn Sie zwei Dateien lesen
Ich hoffe, dass dieses Beispiel jedem hilft zu verstehen, wie sich die internen Variablen von awk wie NR, FNR usw. ändern, wenn awk zwei Dateien verarbeitet.
awk '{print "NR:",NR,"FNR:",FNR,"fname:",FILENAME,"Field1:",$1}' file1 file2
NR: 1 FNR: 1 fname: file1 Field1: f1d1
NR: 2 FNR: 2 fname: file1 Field1: f1d5
NR: 3 FNR: 3 fname: file1 Field1: f1d9
NR: 4 FNR: 1 fname: file2 Field1: f2d1
NR: 5 FNR: 2 fname: file2 Field1: f2d5
NR: 6 FNR: 3 fname: file2 Field1: f2d9
Wo file1 und file2 aussehen:
$ cat file1
f1d1 f1d2 f1d3 f1d4
$ cat file2
f2d1 f2d2 f2d3 f2d4
Beachten Sie, dass der NR Wert unter allen Dateien ständig steigt, während der FNR für jede Datei zurückgesetzt wird. Daher bezieht sich der Ausdruck NR==FNR immer auf die erste Datei, die an awk übergeben wird, da nur in der ersten Datei NR gleich FNR .