AWK
AWK (las iniciales de sus tres creadores, Aho, Weinberger y Kernighan) es un lenguaje de programación orientado al procesamiento de datos. Como se explica en el manual de GNU para AWK:
AWK busca en archivos líneas que contengan un cierto patrón. Cuando lo encuentra, aplica operaciones específicas sobre dichas líneas. Y continúa de esta manera, hasta que alcanza el final del archivo de entrada.
Este modo de operar convierte a AWK en una herramienta muy útil y simple, especialmente para la extracción de datos de archivos muy grandes.
Esta página brinda una muy breve introducción a AWK, a través de ejemplos simples. Pero entendiendo su estructura, es posible hacer luego construcciones más complejas.
Para entender los próximos comandos, es necesario saber que AWK interpreta los archivos de entrada como matrices, organizadas en columnas y filas. Algunas palabras clave:
- F significa 'Field' (campos), y representa las columnas de la matriz.
- R significa 'Record' (registro), y representa las filas de la matriz.
- NF y NR son los números de columnas (fields) y de filas (records), respectivamente.
- FS es el 'Field Separator' (separador de campos), eso es, cómo AWK sabe donde un field termina; este es, usualmente, un espacio, punto y coma, tab, etc.
- OFS significa 'Output Field Separator' (separador de campo de salida), es decir, como separar los campos en el archivo de salida.
- En lo que sigue, 'in' se refiere al nombre de un archivo existente, y 'out' a uno no existente, a ser creado por el comando.
1) Encontrar líneas que contengan la cadena «AA» en el archivo, e imprimir el primer campo (field) de la línea, con los campos separados por punto y coma:
awk 'BEGIN{FS=";"} /AA/ { print $1 }' in
2) Sumar las columnas 1 y 2 de un archivo:
awk '{ print $1+$2 }' in
3) Sumas los valores de la 5ta columna del archivo:
awk '{ sum += $5 } END { print sum }' in
4) Remover la primera columna del archivo:
awk 'BEGIN{FS=OFS=" "}{$1="";}1' in > out
5) Sumar los elementos de cada fila en el archivo:
awk '{ for(i=1; i<=NF;i++) j+=$i; print j; j=0 }' in
6) Sumar los elementos de cada columna en el archivo:
awk 'BEGIN {NR>1} {for (i=1;i<=NF;i++) a[i]+=$i} END {for (i=1;i<=NF;i++) printf a[i] OFS; printf "n"}' in
Algunas aplicaciones de AWK en bash
7) Extraer el 4to campo de la variable 'linea', y guardarla en 'VAR':
VAR=echo ${linea} | awk ' print $4 }'
8) Contar cuantos elementos hay en la variable 'VAR' y guardar ese dato en 'CUANTOS':
CUANTOS=echo $VAR | awk -F " " '{print NF}'
-F define al Field Separator (es equivalente a FS)
9) Sumar dos columnas, cada una de un archivo distinto:
paste in1 in2 | awk '{print NR " " $1+$2 }'
10) Pegar columnas de dos archivos en uno, y luego operar entre esas columnas (el formato de salida es como el del lenguaje C):
paste in1 in2 | awk '{ printf "%3d %6.2fn",$1,$2-$5}' > out
11) Cambiar todos los números menores a -10 y todos los números mayores a 10 en un archivo, por -10 y 10 respectivamente:
(notar que la construcción '() ? :' representa comandos 'if, then, else': () significa if; ? significa then; : significa else)
cat in | awk '{for (i=1; i<=NF; i++) $i = ($i < -10) ? $i = -10 :($i > 10) ? $i = 10 : $i ; print }' >out
12) Reemplazar el campo numero 5 en el archivo in2, por el campo numero 3 en el in1:
awk 'FNR==NR{a[NR]=$3;next}{$5=a[FNR]; print}' in1 in2 > out
y continuar reescribiendo el archivo recién generado, out, para arreglar su formato:
awk '{printf "%7s %4s %8s %8s %6sn", $1, $2, $3, $4, $5}' out > out2