Con esta entrada daré inicio a un mini cursillo dell lenguaje AWK. La pregunta inicial podría ser porque AWK.
La primera vez que escuché que AWK era un lenguaje de procesamiento de patrones mi mente voló demasiado, hoy en día entiendo mejor esta descripción y recordando mi confusión inicial es que escribo esta entrada.
Pero porque aprender AWK?
La primera razón que se me ocurre es el hecho de que es un lenguaje muy pequeño, lo cual permite dominarlo en un tiempo relativamente corto, con un poco de práctica creo que es factible en una semana (si ya se tienen bases de programación) estar haciendo scripts sencillos de manera fluída y con algo más de dedicación en un par de meses puede uno encontrarse por encima del promedio de desarrollo.
El otro motivo de peso que me empuja es que es un lenguaje realmente poderoso para hacer ciertas tareas de manera sencilla y aún así muchas personas no pueden explotarlo de manera correcta.
Mi idea es brindar estas entradas de la manera en que yo fuí aprendiendo el lenguaje, es decir, primero aprenderlo mal y poco a poco aprenderlo bien, por lo que pido una disculpa si alguien ve que cometo algunos errores, solo considere que en su momento así entendí las cosas y eventualmente mejoré varios aspectos de mi desarrollo.
Historia
AWK fue originalmente desarrollado por Aho, Weinberger y Kernigan, posteriormente al ver las capacidades del lenguaje se crearon las versiones NAWK y GAWK las cuales agregaron nuevas características al lenguaje. Al final sirvió como base para la creación de Perl. actualmente podemos encontrar versiones para las principales plataformas y el proyecto GNU mantiene una versión que puede correr en Windows.
Instalación
Si te encuentras en un ambiente Unix es muy probable que ya cuentes con AWK instalado, recomendaría solo validar si se encuentra instalado GAWK, para ello ejecuta en una terminal:
gawk --version
En caso de que no se muestre la versión de GAWK intenta instalarlo con el gestor de paquetes de tu distribución.
Si te encuentras en Windows puedes decargarte GAWK desde la página del proyecto GNU. Otra opción es instalar Cygwin lo cual veo un poco engorroso si solo se quiere utilizar GAWK. La tercera opción es descargar MobaXTerm una aplicación que encapsula Cygwin en un solo ejecutable y que permite traerlo en una memoria usb y utilizarlo donde sea, lo puedes encontrar aquí.
Primeros pasos
La idea de los scripts de AWK es simple, tomar una entrada, típicamente un archivo, y leer de ella los registros (por defecto se delimitan por retorno de línea), por cada registro leído se ejecutara un conjunto de acciones(el cuerpo del script). Tiene un par de secciones especiales que nos permiten ejecutar instrucciones antes de procesar cualquier cosa y/o al final de procesar todo, si se está identificado con la POO yo lo asimilo con un constructor y un destructor.
Estructura
Aunque no sea correcto lo que a continuación diré, si facilitará el entendimiento inicial del lenguaje.
Para introducirnos en el manejo de scripts de AWK es importante entender como debemos estructurar un script:
BEGIN{
#Inicializacion
}
{
#Procesamiento principal
}
END{
#Procesamiento al finalizar
}
Lo primero que vemos en el script es la palabra BEGIN seguida de un bloque (en AWK los bloques de código se delimitan por medio de llaves), esto sirve para indicar que el bloque es el que se debe de ejecutar inmediatamente que se inicie la ejecución del script, incluso antes de leer el primer registro a procesar.
Despues del bloque BEGIN vemos que viene otro bloque que no esta precedido por ninguna palabra esto indica (por el momento) que es el bloque a ejecutar para cada registro que se lea y procese.
Por último vemos la palabra END seguida de un bloque, lo cual indica que el codigo que se encuentra dentro es el que se ejecuta una vez que se han procesado todos los registros de entrada.
Un script básico puede ser:
BEGIN{
print "Inicio del ejemplo"
}
{
print $0
}
END{
print "Fin del ejemplo"
}
Guardemos el script en el archivo ejemplo01.awk y creemos el archivo entrada.txt con el siguiente contenido:
aaa
bbb
ccc
Ahora ejecutemos el script de la siguiente forma:
awk -f ejemplo01.awk entrada.txt
Un detalle a notar aquí es que estamos utilizando la variable $0, es una variable muy especial ya que contiene el registro completo tal como fue leído de la entrada. Si deseáramos acceder a los campos del registro podemos hacerlo con las variables $1, $2, …, $NF donde NF es una variable especial que contiene el número de campos existentes en el registro actual, esto se debe a que se tener una cantidad variable de campos entre cada registro (:o).
Con esto hemos aprendido prácticamente lo básico de AWK oO. Esto se debe a que cuenta con un conjunto de funciones muy básicas, para darte una idea te recomiendo que tengas a la mano el Cheat Sheet de Peteris Krumis disponible aquí, en el hace un excelente trabajo en recabar información de AWK, muestra las variables predefinidas, opciones de línea de comando y funciones disponibles en el lenguaje.
A continuación haremos solo un breve recorrido por las variables especiales de AWK y terminaremos con algunos ejemplos:
FS Especifica el caracter (en GAWK permite una expresión regular) delimitador de campos
OFS Especifica el caracter delimitador de campos al imprimir el registro completo
$0 El registro completo
$1, $2, … Los campos contenidos dentro del registro actual
NR Número de registro actual procesado por el script
FNR Número de registro actual del archivo en curso
FILENAME El nombre del archivo del cual se está leyendo actualmente la entrada