Pregunta 1¿Cuándo se ejecuta el body de BEGIN { ... }?
awk — Agregación y reportes
Practica awk: el orden en que se ejecutan BEGIN { } y END { }, s += $1 para acumular la columna 1 en un total y el conteo con NR o { c++ } para crear reportes de agregación — ilustrado y en una terminal del navegador.
Ejecutar antes y después — BEGIN y END
awk procesa cada línea en orden, pero puedes poner el trabajo que quieres ejecutar una sola vez antes y después en BEGIN { ... } y END { ... }. BEGIN se ejecuta una vez antes de leer la primera línea y END se ejecuta una vez después de leer todas las líneas. Úsalos para imprimir un encabezado al inicio o para imprimir un resumen al final.
BEGIN se ejecuta una vez antes del procesamiento, el body se ejecuta por línea y END se ejecuta una vez después.| Forma | Significado |
|---|---|
BEGIN { ... } | Se ejecuta una vez antes de leer la primera línea |
{ ... } | El body se ejecuta repetidamente, una línea a la vez |
END { ... } | Se ejecuta una vez después de leer todas las líneas |
s += $1 | Sigue sumando la columna 1 a la variable s (total acumulado) |
NR | Líneas leídas hasta ahora (el total de líneas al final) |
{ c++ } END { print c } | Incrementa c por línea e imprime el conteo al final |
printf 'start\nmiddle\nend\n' > lines.txt # crear 3 líneas de material
awk 'BEGIN { print "--- report ---" } { print $0 } END { print "rows:", NR }' lines.txt
# un encabezado al inicio, rows: 3 al final
Suma y conteo — s += $1 y NR
En awk puedes usar variables sin declararlas y los números se suman directamente. Escribir { s += $1 } en el body sigue sumando la primera columna de cada línea a la variable s y END { print s } imprime el total al final. Para un conteo, imprime NR (el número de líneas leídas) directamente en END o incrementa un contador con { c++ } e imprímelo con END { print c }. Con esto puedes crear reportes de agregación como el total de ventas o un conteo de registros.
s += $1 suma la columna 1 línea a línea y END imprime el total de 60.printf '120 mon\n80 tue\n200 wed\n' > sales.txt # crear 3 líneas con números
awk '{ s += $1 } END { print "total:", s }' sales.txt # total: 400
awk 'END { print "days:", NR }' sales.txt # days: 3
Contar con un contador — { c++ } END { print c }
NR cuenta cada línea, pero cuando quieres contar solo las que coinciden con una condición, usa un contador en el body. { c++ } incrementa la variable c en 1 por cada línea leída y END { print c } imprime ese conteo. Añadir un patrón como /pat/{ c++ } cuenta solo las líneas que contienen una cadena específica.
/pass/{ c++ } incrementa c solo en las líneas que coinciden y END imprime el conteo de 2.| Forma | Significado |
|---|---|
{ c++ } | Incrementa la variable c en 1 por cada línea leída |
/pattern/{ c++ } | Incrementa c solo en las líneas que contienen pattern |
END { print c } | Imprime el conteo c una sola vez al final |
printf 'ok pay\nng pay\nok ship\n' > log.txt # crear 3 líneas con un estado
awk '/ok/{ c++ } END { print "ok count:", c }' log.txt # contar líneas con ok -> 2
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué muestra awk '{ s += $1 } END { print s }' f?
Pregunta 3¿Qué aparece cuando imprimes NR en el bloque END?