Question 1Quand le corps de BEGIN { ... } s'exécute-t-il ?
awk — Agrégation et rapports
Pratique awk : l'ordre d'exécution de BEGIN { } et END { }, s += $1 pour cumuler la colonne 1 en un total, et le comptage avec NR ou { c++ } pour construire des rapports d'agrégation — illustré et en pratique dans un terminal en navigateur.
Exécuter avant et après — BEGIN et END
awk traite chaque ligne l'une après l'autre, mais tu peux placer le travail à exécuter une seule fois avant et après dans BEGIN { ... } et END { ... }. BEGIN s'exécute une fois avant la lecture de la première ligne, et END s'exécute une fois après que toutes les lignes ont été lues. Utilise-les pour afficher un en-tête au départ ou pour afficher un résumé à la toute fin.
BEGIN s'exécute une fois avant le traitement, le corps une fois par ligne, et END une fois après.| Forme | Signification |
|---|---|
BEGIN { ... } | Exécuté une fois avant la lecture de la première ligne |
{ ... } | Le corps exécuté de façon répétée, une ligne à la fois |
END { ... } | Exécuté une fois après la lecture de toutes les lignes |
s += $1 | Accumule la colonne 1 dans la variable s (un total cumulé) |
NR | Nombre de lignes lues jusqu'ici (le nombre total de lignes à la fin) |
{ c++ } END { print c } | Incrémente c par ligne et affiche le compte à la fin |
printf 'start\nmiddle\nend\n' > lines.txt # créer 3 lignes de données
awk 'BEGIN { print "--- report ---" } { print $0 } END { print "rows:", NR }' lines.txt
# un en-tête au départ, rows: 3 à la fin
Somme et compte — s += $1 et NR
Avec awk tu peux utiliser des variables sans les déclarer, et les nombres s'additionnent directement. En écrivant { s += $1 } dans le corps, la première colonne de chaque ligne est accumulée dans la variable s, et END { print s } affiche le total à la fin. Pour un compte, soit tu affiches NR (le nombre de lignes lues) directement dans END, soit tu incrémentes un compteur avec { c++ } et tu l'affiches avec END { print c }. Tu peux ainsi construire des rapports d'agrégation comme un total de ventes ou un nombre d'enregistrements.
s += $1 ajoute la colonne 1 ligne par ligne, et END affiche le total de 60.printf '120 mon\n80 tue\n200 wed\n' > sales.txt # créer 3 lignes avec des nombres
awk '{ s += $1 } END { print "total:", s }' sales.txt # total: 400
awk 'END { print "days:", NR }' sales.txt # days: 3
Compter avec un compteur — { c++ } END { print c }
NR compte toutes les lignes, mais quand tu veux compter uniquement les lignes qui correspondent à une condition, utilise un compteur dans le corps. { c++ } incrémente la variable c de 1 pour chaque ligne lue, et END { print c } affiche ce compte. En ajoutant un motif comme /pat/{ c++ }, tu comptes uniquement les lignes contenant une chaîne particulière.
/pass/{ c++ } incrémente c uniquement sur les lignes correspondantes, et END affiche le compte de 2.| Forme | Signification |
|---|---|
{ c++ } | Incrémente la variable c de 1 pour chaque ligne lue |
/pattern/{ c++ } | Incrémente c uniquement sur les lignes contenant pattern |
END { print c } | Affiche le compte c une fois à la fin |
printf 'ok pay\nng pay\nok ship\n' > log.txt # créer 3 lignes avec un statut
awk '/ok/{ c++ } END { print "ok count:", c }' log.txt # compter les lignes contenant ok -> 2
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Que montre awk '{ s += $1 } END { print s }' f ?
Question 3Que s'affiche-t-il quand tu affiches NR dans le bloc END ?