awk
Elaborazione a due file
Ricerca…
Controlla i campi corrispondenti in due file
Dati questi due file CSV:
$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6
Per stampare quelle righe in file2 cui seconda colonna si trova anche nel primo file possiamo dire:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4
Qui, le lines[] contengono una matrice che viene popolata durante la lettura di file1 con il contenuto del secondo campo di ciascuna riga.
Quindi, la condizione $2 in lines controlla, per ogni riga nel file2 , se il secondo campo esiste nell'array. In tal caso, la condizione è True e awk esegue l'azione predefinita, consistente nella stampa dell'intera riga.
Se fosse necessario stampare un solo campo, questa potrebbe essere l'espressione:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2
Stampa le variabili awk durante la lettura di due file
Spero che questo esempio possa aiutare tutti a capire in che modo le variabili interne di awk come NR, FNR etc cambiano quando awk sta elaborando due file.
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
Dove file1 e file2 assomigliano a:
$ cat file1
f1d1 f1d2 f1d3 f1d4
$ cat file2
f2d1 f2d2 f2d3 f2d4
Si noti come il valore NR continua ad aumentare tra tutti i file, mentre FNR ripristina su ciascun file. Questo è il motivo per cui l'espressione NR==FNR sempre riferimento al primo file inviato ad awk, poiché solo nel primo file è possibile avere NR uguale a FNR .