Zoeken…


Vink overeenkomende velden in twee bestanden aan

Gezien deze twee CSV-bestanden:

$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6

Om die regels in file2 af te drukken waarvan de tweede kolom ook in het eerste bestand voorkomt, kunnen we zeggen:

$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4

Hier bevat lines[] een array die wordt gevuld bij het lezen van file1 met de inhoud van het tweede veld van elke regel.

Vervolgens controleert de voorwaarde $2 in lines voor elke regel in file2 of het 2e veld in de array voorkomt. Als dit het geval is, is de voorwaarde Waar en voert awk de standaardactie uit, die bestaat uit het afdrukken van de volledige regel.

Als er slechts één veld moest worden afgedrukt, zou dit de uitdrukking kunnen zijn:

$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2

Ik hoop dat dit voorbeeld iedereen zal helpen begrijpen hoe awk interne variabelen zoals NR, FNR enz. Veranderen wanneer awk twee bestanden verwerkt.

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

Hoe file1 en file2 eruit zien:

$ cat file1
f1d1 f1d2 f1d3 f1d4

$ cat file2
f2d1 f2d2 f2d3 f2d4

Merk op hoe de NR waarde tussen alle bestanden blijft toenemen, terwijl FNR op elk bestand wordt gereset. Dit is de reden waarom de uitdrukking NR==FNR altijd verwijst naar het eerste bestand dat naar awk wordt ingevoerd, omdat alleen in het eerste bestand NR gelijk aan FNR .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow