8.1.- Comenzando con awk

Los programas en awk son diferentes a la mayoría de los otros lenguajes de programación, ya que estos están basados en datos (es decir, describen los datos con los que quieren trabajar y qué hacer cuando lo encuentren). La mayoría de los otros idiomas son procesales; Usted tiene que describir, con gran detalle, los pasos que debe tomar el programa. Cuando se trabaja con lenguajes de procesos, suele ser mucho más difícil para describir claramente los datos que procesará su programa. Por esta razón, los programas awk son a menudo gratamente fáciles de leer y escribir.

Al ejecutar awk, se especifica un programa awk que le dice qué hacer. El programa consiste en una serie de reglas (también puede contener definiciones de funciones, una característica avanzada que ignoraremos por ahora). Cada regla especifica un patrón para buscar y una acción para realizar cuando encuentra el patrón.

Sintácticamente, una regla consiste en un patrón seguido por una acción. La acción está encerrada entre llaves para separarla del patrón. Las reglas de Newlines (RS) generalmente separan las reglas. Por lo tanto, un programa awk se ve así:

El comando awk recibe como argumento la lista de archivos a tratar. Si se omiten los archivos en la línea de comandos, awk trabajará con los datos que le lleguen por su entrada estándar (teclado). Por lo tanto este comando se puede poner después de una tubería de comunicaciones.

Veamos la tabla siguiente que representa las principales variables internas del lenguaje awk presentes en la memoria desde el primer momento de su ejecución. El valor de estas variables pueden ser modificado si se desea en función de la estructura de datos a tratar.

Por defecto, un registro se corresponde con una línea (conjunto de caracteres terminado con «\n»).

Los registros son tratados de manera sucesiva. El registro actual es automáticamente dividido en campos y un cierto número de variables internas awk son entonces inicializadas. como muestra la siguiente tabla con la lista de las variables inicializadas.

Desglosando:

Con la función print, también puede aceptar cadenas de caracteres como argumento:

Veamos un ejemplo que muestra el archivo de texto agenda.txt y que trataremos con awk. Los campos están separados con «|«.

Vamos a modificar el separador de campo con la opción -F, mostraremos el número de línea y el nombre del cliente.

Lo mismo pero añadimos también el teléfono:

Es posible seleccionar los registros sobre los cuales se ejecutará la acción.

Los registros a tratar pueden solucionarse utilizando las expresiones regulares extendidas.

Muestra las líneas del archivo agenda.txt que contengan por lo menos un carácter «/«:

Podemos hacer que un campo en particular corresponda con una expresión regular. En este caso, hay que usar el operador de concordancia (~) o el de no concordancia (!~).

Mostrar los clientes localizados en la provincia de Ciudad Real:

No mostrar los clientes de la provincia de Ciudad Real

El criterio puede ser una expresión compuesta de operadores y devolviendo el valor verdadero o falso.

Tabla de operadores comunes de verificación.

Mostrar el nombre y el teléfono de los clientes de las líneas 1 y 2:

Tratamiento de las líneas desde la 2 a la 4:

A partir de cierto número de acciones que se tengan que realizar sobre los datos, es más cómodo escribir un script awk. Un script awk puede contener una sección BEGIN, una sección END, y de 0 a n secciones intermedias. Todas las secciones son opcionales.

La sección BEGIN se ejecuta antes del tratamiento del primer registro de datos. Se usa esencialmente para iniciar el contexto de ejecución.

Puede haber varias secciones intermedias que se ejecutarán sobre cada registro.

La sección END se ejecuta después del tratamiento del último registro de datos. Se usa para explotar los resultados obtenidos del tratamiento de datos.

Un comentario comienza con el carácter «#» y se termina con el carácter «\n«.

El programador puede crear sus propias variables. Una variable está definida a partir del instante en que se ha inicializado y no tiene necesidad de estar marcada. El uso de una variable que nunca se definió tiene el valor 0 en un contexto numérico y cadena vacía en el contexto de una cadena.

Modificación del valor del separador de campos e inicialización de tres nuevas variables que asumen el papel de contadores. 

Ejecución de cada registro por parte de tres secciones intermedias. Para cada registro:

  • Si el código postal comienza por 28, el nombre del cliente se muestra precedido de la palabra «Madrid. Después se incrementa el contador nb_28.
  • Lo mismo si el código comienza por el código 38, muestra los clientes precedidos de la palabra «S.C Tenerife.
  • Para Barcelona que el código postal comienza por 08…

Muestra el número total de clientes (NR), en Madrid, Tenerife y Barcelona.

El listado del script sería:

Resultado de la ejecución:

  • Prueba diferentes modos de mostrar sus bases de datos de texto.
  • Intenta hacer una base de datos de componentes informáticos usando el separador «|».