Introducción a AWK (I)

El lenguaje

AWK es un lenguaje que permite muchas cosas, su utilidad más común es buscar líneas en archivos de texto y ejecutar acciones especificadas para esa línea. Normalmente un programa AWK es del estilo a


patrón { accion }
patrón { accion }
patrón { accion }
...

Se ejecuta de las dos siguientes formas, dependiendo de si tenemos el programa en un archivo o no. programa tiene la pinta que hemos visto antes.


# Esto es un comentario. Las comillas simples suelen ser requeridas
# para poder poner varias lineas y que el shell tome programa como
# un solo argumento
awk ’programa’ entrada_1 entrada_2 ...

Y con el programa en un archivo

1
2
# Aqui el archivo_programa contiene el programa awk
awk -f archivo_programa entrada_1 entrada_2 ...

Nota: Si no se especifica un archivo de entrada, se utiliza la entrada estándar.

Instalación

AWK, o implementaciones parecidas como gawk (de GNU AWK), vienen instalados por defecto en la mayoría de los sistemas operativos. (MAC, Linux, Unix) y para Windows sigue este enlace para instalar gawk, si no lo tienes instalado ya.

Primeros Pasos

Teniendo en un archivo, llamésmole agenda.txt lo siguiente

1
2
3
4
5
6
7
8
9
10
11
12
$ cat agenda.txt
Maria        938563212    maria@gmail.com   B
Irene        944683129    irene@hotmail.com A
Pedro        659817325    pedro@google.com  A
Carlos       982256987    carlos@gmail.com  A
Francisco    669332112    paco@hotmail.com  C
Julia        678963888    julia@gmail.com   B
Pedro        928975641    pedro@msn.com     B
Manuel       698788221    manuel@trep.es    A
César        956213584    cesar@hotmail.com A
Javier       918745251    javi@google.com   C
Antonio      666999879    antonio@msn.com   C

Ahora por ejemplo, obtengamos todas las líneas de las personas que se llaman Pedro.

1
 awk '/Pedro/ { print $0 }' agenda.txt

Cada parte tiene su significado, como se puede ver en la imagen:

La salida de esto es:

Pedro 659897325 pedro@google.com A
Pedro 928975641 pedro@msn.com B

Es decir, en $0, $1…$N, siendo N el nº de columnas, tendremos ciertos valores, siempre referidos a la línea actual que está procesando AWK. Recuerda siempre que en $0 tenemos la línea que estamos procesando completa. Por ejemplo, con nuestra agenda tendremos:

Es decir que podemos referirnos a una columna en concreto, para buscar el teléfono de alguien, por ejemplo.
Pongamos que queremos llamar a Julia, en ese caso hacemos:

1
awk '$1=="Julia" { print "El nº de " $1 " es " $2 }' agenda.txt

Explicación: En $1 se tendrá el contenido de la primera columna de la línea que estamos procesando, por lo que cuando lleguemos a que en la 1ª columna hay “Julia” imprimimos “El nº de (contenido de la 1ª columna) es (contenido de la segunda columna)”. Está claro, que la parte “patrón” a la que nos referiamos al principio no tiene por qué ser una expresión regular, puede ser una condición, como en este ejemplo.

Así que la salida de esto, efectivamente, es:

El nº de Julia es 678963888

Y en otro archivo, para más ejemplos, tenemos un inventario, siendo la última columna la cantidad que hemos facturado en ese mes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat inventario.txt 
Ene  13  25  15 115
Feb  15  32  24 226
Mar  15  24  34 228
Abr  31  52  63 420
May  16  34  29 208
Jun  31  42  75 492
Jul  24  34  67 436
Ago  15  34  47 316
Sep  13  55  37 277
Oct  29  54  68 525
Nov  20  87  82 577
Dic  17  35  61 401
 
Ene  21  36  64 620
Feb  26  58  80 652
Mar  24  75  70 495
Abr  21  70  74 514

Veamos cual es la suma total que nos hemos llevado en el primer año.

 awk 'FNR<=12 { sum=sum+$5 }; END {print "Hemos ganado " sum "€ este año"}' inventario.txt

Explicación: AWK tiene una serie de valores reservados que podemos utilizar. En este caso, usamos FNR, que tiene el número de línea en el que estamos. Así que como un año tiene 12 meses, la condición para que se ejecute nuestro programa es que FNR, es decir, el nº de línea, sea menor o igual a 12. Si es así vamos acumulando en la variable “sum” la suma total del dinero de la columna 5ª de cada línea, y cuando terminamos (END) imprimimos el resultado.

La salida de este es:

Hemos ganado 4221€ este año

Bueno AWK tiene muchas posibilidades, y bien utilizado puede sacarnos de apuros sin necesidad de utilizad ni XML, ni MySQL, ni Excel, simplemente con un archivo de texto plano, y dándole un significado a cada columna. Algunas utilidades reales que se me ocurren: una agenda, una lista de la compra con sus precios, una plantilla, tareas pendientes…en fin el límite lo pones tú.

Dentro de poco haré más post sobre AWK, esto era solo una introducción.
Edito: Ya está online la 2ª parte de esta serie de posts sobre AWK.