Recherche…


Vérifiez les champs correspondants dans deux fichiers

Compte tenu de ces deux fichiers CSV:

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

Pour imprimer ces lignes file2 dont la deuxième colonne se produit également dans le premier fichier , on peut dire:

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

Ici, lines[] contient un tableau qui est rempli lors de la lecture de file1 avec le contenu du second champ de chaque ligne.

Ensuite, la condition $2 in lines vérifie, pour chaque ligne du file2 , si le deuxième champ existe dans le tableau. Si tel est le cas, la condition est True et awk effectue son action par défaut, consistant à imprimer la ligne complète.

Si un seul champ devait être imprimé, cela pourrait être l'expression:

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

Imprimer des variables awk lors de la lecture de deux fichiers

J'espère que cet exemple aidera tout le monde à comprendre comment les variables internes telles que NR, FNR, etc. changent lorsque awk traite deux fichiers.

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

Où fichier1 et fichier2 ressemblent à:

$ cat file1
f1d1 f1d2 f1d3 f1d4

$ cat file2
f2d1 f2d2 f2d3 f2d4

Notez que la valeur NR continue d'augmenter parmi tous les fichiers, tandis que FNR réinitialise sur chaque fichier. C'est pourquoi l'expression NR==FNR réfère toujours au premier fichier fourni à awk, car seul le premier fichier permet d'avoir NR égal à FNR .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow