Aprende leyendo en orden

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.

El orden en que se ejecutan BEGIN y END
BEGIN { ... }una vez antes de leerimprimir encabezadoprimero{ body }se repite por líneauna línea a la vezEND { ... }una vez trastodas las líneasimprimir sumao conteo
BEGIN se ejecuta una vez antes del procesamiento, el body se ejecuta por línea y END se ejecuta una vez después.
FormaSignificado
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 += $1Sigue sumando la columna 1 a la variable s (total acumulado)
NRLí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

① Crea un archivo de material de 3 líneas con printf 'apple\nbanana\ncherry\n' > fruits.txt.

② Comprueba el contenido con cat fruits.txt.

③ Con awk, imprime una línea de encabezado una sola vez en BEGIN, imprime cada línea tal como está en el body y muestra el total de líneas una sola vez en END usando NR.

④ Verifica que el encabezado esté arriba, las 3 líneas en el medio y el conteo de líneas al final. (Si lo ejecutas correctamente, aparecerá una explicación.)

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

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.

Acumular la columna 1 en un total
10 apple20 banana30 cherrys += $1 -> s=10s += $1 -> s=30END print s -> 60
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

① Crea 3 líneas con números usando printf '50 a\n70 b\n30 c\n' > nums.txt.

② Comprueba el contenido con cat nums.txt.

③ En el body de awk, sigue sumando la columna 1 a una variable e imprime su total una sola vez en END.

④ Luego, en END de awk, usa NR para imprimir el conteo de líneas (el número de registros).

⑤ Verifica que el total y el conteo se muestren en pantalla.

Linux console
0 / 4 completado(s)
Loading Linux Terminal...

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.

Contar solo las líneas que coinciden con un contador
pass xfail ypass z/pass/ c++ -> c=1fail -> no contadoEND print c -> 2
/pass/{ c++ } incrementa c solo en las líneas que coinciden y END imprime el conteo de 2.
FormaSignificado
{ 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

① Crea 3 líneas con un estado usando printf 'pass x\nfail y\npass z\n' > result.txt.

② Comprueba el contenido con cat result.txt.

③ Con awk, incrementa un contador solo en las líneas que contienen pass e imprime ese conteo una sola vez en END.

④ Verifica que el conteo mostrado coincide con el número de líneas que contienen pass.

⑤ Sobre el mismo result.txt, ejecuta tanto awk 'END { print NR }' result.txt (total de líneas) como awk '/pass/{ c++ } END { print "pass count:", c }' result.txt (conteo de coincidencias) y compara la diferencia.

Linux console
0 / 4 completado(s)
Loading Linux Terminal...
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Cuándo se ejecuta el body de BEGIN { ... }?

Pregunta 2¿Qué muestra awk '{ s += $1 } END { print s }' f?

Pregunta 3¿Qué aparece cuando imprimes NR en el bloque END?