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:
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:
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:
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.

Sin comentarios
Trackbacks