Qu'est-ce que “NR==FNR” dans awk?
Je suis d'apprentissage comparaison de fichiers à l'aide de awk
.
J'ai trouvé la syntaxe comme ci-dessous,
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
Je ne pouvais pas comprendre ce qu'est la signification de NR==FNR
dans ce domaine?
Si j'essaie de la FNR==NR
puis aussi je reçois même sortie?
Ce que cela fait exactement ?
- Seriez-vous surpris si
a==b
etb==a
produit le même résultat? - Voir
Two-file Processing
sur backreference.org/2010/02/10/idiomatic-awk
Vous devez vous connecter pour publier un commentaire.
Dans awk,
FNR
désigne le numéro de l'enregistrement (généralement le numéro de la ligne) dans le fichier courant etNR
" désigne le total nombre record. L'opérateur==
est un opérateur de comparaison, qui renvoie vrai si les deux environnant les opérandes sont égaux.Cela signifie que la condition
NR==FNR
n'est vrai que pour le premier fichier, commeFNR
repasse à 1 pour la première ligne de chaque fichier, maisNR
continue d'augmenter.Ce modèle est généralement utilisé pour effectuer des actions sur seul le premier fichier. Le
next
à l'intérieur du bloc signifie que toutes les autres commandes sont ignorés, alors qu'ils sont seulement exécuter sur les fichiers autres que la première.La condition
FNR==NR
compare les deux opérandes commeNR==FNR
, de sorte qu'il se comporte de la même manière.a='3x'; if [[ $a == 3* ]]; then echo yes; fi
et vous ne pouvez pas changer les deux côtés de==
.Look pour les clés (premier mot de la ligne) dans fichier2 qui sont aussi dans fichier1.
Étape 1: remplir un tableau avec les premiers mots de fichier 1:
Étape 2: Remplir un tableau et d'ignorer le fichier 2 dans la même commande. Pour cela, vérifiez le nombre total de dossiers jusqu'à maintenant, avec le numéro de l'entrée de courant de fichier.
Étape 3: Ignorer les actions qui pourraient venir après
}
lors de l'analyse du fichier 1Étape 4: la touche d'impression de fichier2 lorsqu'elle se trouve dans le tableau à une
;next
est un drôle de plus (comme pour ajouternext
et ont besoin d'un point-virgule à l'étape 3). Vous pouvez tester l'étape 1 avecawk '{a[$1]} END { for (k in a) { print "a[k]=" k } }' file1
.Rechercher
NR
etFNR
dans le awk manuel et puis demandez-vous quelle est la condition sous laquelleNR==FNR
dans l'exemple suivant:ARGIND
, sinon vous pouvez faireFNR==1{ print ++file_nr }
.Il y a
awk
variables intégrées.NR
- Il donne le nombre total de dossiers traités.FNR
- Il donne le nombre total d'enregistrements pour chaque fichier d'entrée.En supposant que vous avez des Fichiers a.txt et b.txt avec
Garder à l'esprit
NR et FNR sont awk variables intégrées.
NR - Donne le nombre total de dossiers traités. (dans ce cas, à la fois dans a.txt et b.txt)
FNR - Donne le nombre total d'enregistrements pour chaque fichier d'entrée (dossiers en a.txt ou b.txt)
permet d'Ajouter des "suivant" pour passer à la première appariés avec NR==FNR
dans b.txt et dans a.txt
dans b.txt mais pas dans a.txt