Linux / Comando awk: procesar campos, filtrar y calcular

awk divide la entrada en registros y campos para mostrar o calcular los valores que cumplen con las condiciones. Es útil para extraer columnas, agregar registros y crear informes simples.

De forma predeterminada, cada línea es un registro y los espacios o tabulaciones separan sus campos. $0 representa el registro completo, $1 el primer campo, NF la cantidad de campos y NR el número acumulado de registros leídos. Utilice -F para especificar otro separador cuando corresponda.

Sintaxis básica

awk [opciones] 'patrón { acción }' [archivo ...]

La implementación instalada y las opciones pueden variar según la distribución. Verifique la descripción de man awk en el sistema actual.

Comprobar selección, condición y suma en la misma entrada

El bloque siguiente solo crea archivos de ejemplo en un nuevo directorio temporal y se ejecuta dentro de los paréntesis. No sobrescribe archivos en el directorio de trabajo existente y muestra la ubicación de los datos en la última línea. Los nombres de archivo utilizados en la sintaxis de los comandos se preparan dentro de este bloque, por lo que ejecute todo el bloque junto. Después de verificar los resultados, elimine únicamente los archivos de práctica cuando ya no los necesite.

(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
printf 'name amount\nAna 12\nBob 7\nCara 11\n' > amounts.txt
awk 'NR > 1 {print $2}' amounts.txt
awk 'NR > 1 && $2 >= 10 {print $1}' amounts.txt
awk 'NR > 1 {sum += $2} END {print sum}' amounts.txt
printf 'Dana missing\n' >> amounts.txt
awk 'NR == 1 {next}
     NF != 2 || $2 !~ /^[0-9]+([.][0-9]+)?$/ {
         print "invalid row " NR ": " $0 > "/dev/stderr"
         bad = 1; next
     }
     {sum += $2}
     END {if (bad) exit 1; print sum}' amounts.txt || test "$?" -eq 1
printf 'Lab files: %s\n' "$labdir"
)

La segunda columna, excluyendo el encabezado, es 12·7·11, la selección condicional es Ana·Cara, y la suma es 30. Después de agregar Dana missing, la prueba imprime invalid row 5 en error estándar y no muestra la suma exitosa. Esta prueba solo permite números decimales no negativos como en el ejemplo, y se deben ajustar las reglas para datos que requieran números negativos, notación exponencial o separadores decimales locales. La clave es no sumar automáticamente 0 para campos vacíos, encabezados o cadenas.

Opciones y formatos principales

Opciones·Formato Descripción
-F separador Especifique el separador de campos de entrada.
-v nombre=valor Transmita los valores iniciales de las variables awk.
BEGIN Patrón que se ejecuta antes de leer la primera fila de entrada.
END Patrón que se ejecuta después de procesar la última fila de entrada.

Precauciones al usar

awk -F, no puede analizar correctamente un CSV que tenga comas dentro de comillas. Si la entrada es CSV, utilice un analizador dedicado. Las funciones exclusivas de GNU gawk pueden no funcionar en otras implementaciones de awk.

Preguntas frecuentes

¿Cuál es la diferencia entre $0 y $1 en awk?

$0 es todo el registro actual, $1 es el primer campo.

Documentación oficial

Puede verificar el comportamiento exacto de las opciones y las diferencias entre implementaciones en la documentación oficial de awk.