Hipatia

Awk

AWK es un intérprete y un lenguaje de programación diseñado para procesar datos basados en texto, ya sean ficheros o flujos de datos. El nombre AWK deriva de las iniciales de los apellidos de sus autores: Alfred Aho, Peter Weinberger, y Brian Kernighan. Tres personajes históricos del mundo de Unix y la informática en general. AWK fue una de las primeras herramientas en aparecer en Unix (en la versión 3) y por ello está presente en casi todo sistema operativo tipo Unix moderno.

En la práctica, el uso de awk suele caer en dos amplias categorías. Una es la que podría considerarse generación de informes: esto implica el procesado de una entrada para extraer conteos, sumas, subtotales, etcétera. Esto también incluye la escritura de programas de validación de datos triviales, como la verificación de campos que contengan contiene únicamente información numérica o analizar si ciertos delimitadores están adecuadamente balanceados. Una segunda categoría es su uso como transformador de datos, convirtiendo datos de la forma producida por un programa en la esperada por otro distinto. Los ejemplos más simples consisten en simplemente seleccionar campos, y tal vez reorganizarlos.

Uso básico

La operación básica de awk es analizar un conjunto de líneas de entrada en orden buscando por coincidencias que se han especificado. Para cada patrón o coincidencia, puede especificarse una acción; esta acción será llevada a cabo en cada línea que muestre coincidencias, y se le dará salida. Un programa típico de awk estará formado por una o varias acciones precedidas o no de condiciones o patrones. Cada línea de entrada será analizada por awk. Si en la línea concreta se cumple un patrón indicado en el programa se ejecutará la acción asociada a ese patrón.

Este comando divide a cada línea del fichero en campos o registros en base a un delimitador (suele ser el espacio aunque podremos cambiarlos). Además, en awk podemos referirnos a cada campo de cada línea usando las variables internas $1,$2, $3, … que equivalen a el primer campo de esa línea, el segundo, el tercero y así sucesivamente. La sintáxis propia de awk puede parecer algo extraña pero una vez nos acostumbremos es muy clara. Tanto el patrón como la acción van rodeadas de comillas simples y es fundamental además, encajar la acción o acciones entre llaves. El bloque de las acciones puede agrupar una o varias acciones y en ese segundo caso hemos de separarlas por ;. La sintáxis resumida sería la siguiente:

    awk 'patrón {acción o acciones}' fichero

Vamos a ver un ejemplo. Tenemos un fichero llamado ciudades.txt que posee una tabla con nombres de ciudades, un código de país y unas temperaturas medias. Este fichero se ha construido con un editor de textos sencillo y utilizando tabuladores para separar cada campo de cada línea, de ahí que muestre ese aspecto similar a una tabla. Vamos a procesar este fichero de diferentes usando awk para extraer de el información útil.

sergio@hipatia:~$ cat ciudades.txt
Madrid      ES    31
Barcelona   ES    25
Londres     UK    19
Berlín      DE    12
Sevilla     ES    36

Ahora vamos a lanzar sobre el fichero de las ciudades varias consultas con awk y así extraer la información que nos interesa en cada caso. Por ejemplo, imprimimos las ciudades con temperatura superior a 30 grados:

sergio@hipatia:~$ awk '$3>30 {print $1}' ciudades.txt
Madrid
Sevilla

Imprimimos las ciudades cuyo código es ‘ES’:

sergio@hipatia:~$ awk '$2=="ES" {print $1}' ciudades.txt
Madrid
Barcelona
Sevilla

Imprimimos las ciudades cuyo código NO es ‘ES’ y su temperatura es mayor que 15 grados:

sergio@hipatia:~$ awk '$2!="ES" && $3>15 {print $1}' ciudades.txt
Londres

El comando awk puede usarse mucho más allá de los ejemplos sencillos que hemos mostrado aquí. Podemos construir bloques complejos de acciones y utilizar varias expresiones en la misma invocación lo que nos permitirá crear comandos de gran potencia y versatilidad. Una última curiosidad que aprenderemos de awk es la posibilidad tanto de modificar el delimitador por defecto para la entrada como el delimitador por defecto que se considera en la salida para separar los campos. Por ejemplo, pambiar el delimitador de campos en la entrada usando el modificador FS. Esto puede permitir procesar ficheros que no usen el espacio como delimitador (como el fichero de usuarios /etc/passwd) campo a campo:

sergio@hipatia:~$ awk '{print $1}' FS=":" /etc/passwd

También podemos modificar el delimitador generado por awk en la salida usando el modificador OFS. Ahora completaremos el comando anterior para indicar que los campos que se muestren en la salida estén separados por un tabulador:

awk '{print $1,$3}' FS=":" OFS="\t" /etc/passwd

Esto solo es un uso superficial del comando awk cuya potencia va mucho más allá y nos permitirá realizar acciones mucho más complejas y útiles para muchas situaciones.


Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.