Pour comprendre comment ça marche, le plus simple, ici, est de l'exécuter morceau par morceau en affichant les valeurs des variables:
Dans un premier temps, le RS="1" est vrai tout au long du programme. Le caractère "1" remplace le retour à la ligne (\n) pour séparer les Records (une ligne en temps normal).
Le motif n°1 est une expression régulière qui sera vraie si la ligne contient "FIELDA2". Dans ce cas, l'action assignera le numéro de ligne courant NR à f.
Comme f contient le numéro de ligne de la clef recherchée, reste à afficher la ligne suivante qui contient la valeur. Elle est sélectionnée par f&&NR-1==f qui s'écrit f && ( (NR-1) == f). Considérons seulement (NR-1)==f, cette expression est vraie 2 fois, une avant l'assignation de la première expression, l'autre après.
# Une explication
Posté par pma . En réponse au message Awk : Besoin d'explications. Évalué à 10.
Bonjour,
La commande complète et ce qui est attendu:
Pour comprendre comment ça marche, le plus simple, ici, est de l'exécuter morceau par morceau en affichant les valeurs des variables:
RS="1"est vrai tout au long du programme. Le caractère "1" remplace le retour à la ligne (\n) pour séparer les Records (une ligne en temps normal).NRàf.fcontient le numéro de ligne de la clef recherchée, reste à afficher la ligne suivante qui contient la valeur. Elle est sélectionnée parf&&NR-1==fqui s'écritf && ( (NR-1) == f). Considérons seulement(NR-1)==f, cette expression est vraie 2 fois, une avant l'assignation de la première expression, l'autre après.Donc on se protège en vérifiant que f est assigné:
( ( f ) && ( ( NR -1 ) == f ) )On peut donc écrire le programme comme
Note: Le séparateur "1" n'est pas très bien choisi (pas de
FIELDA1)