awk
Tvåfilsbehandling
Sök…
Kontrollera matchande fält i två filer
Med tanke på dessa två CSV-filer:
$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6
För att skriva ut de raderna i file2 vars andra kolumn också förekommer i den första filen kan vi säga:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4
Här innehåller lines[] en matris som file1 när du läser file1 med innehållet i det andra fältet på varje rad.
Sedan kontrollerar villkoret $2 in lines , för varje rad i file2 , om det andra fältet finns i matrisen. I så fall är villkoret sant och awk utför sin standardåtgärd, bestående av att skriva ut hela linjen.
Om bara ett fält behövde skrivas ut, kan detta vara uttrycket:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2
Skriv ut awk-variabler när du läser två filer
Jag hoppas att det här exemplet hjälper alla att förstå hur awk interna variabler som NR, FNR osv förändras när awk bearbetar två filer.
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
Där fil1 och fil2 ser ut:
$ cat file1
f1d1 f1d2 f1d3 f1d4
$ cat file2
f2d1 f2d2 f2d3 f2d4
Lägg märke till hur NR värdet fortsätter att öka bland alla filer medan FNR återställer på varje fil. Därför hänvisar uttrycket NR==FNR alltid till den första filen som matas till awk, eftersom endast i första filen är möjligt att ha NR lika med FNR .