25 de abril de 2008

AZ 22:Lenguajes de programación en UNIX Parte 1/5: AWK.

Introducción
El AWK es un lenguaje de programación diseñado para facilitar las tareas más comunes en cuanto al manejo de información y manipulación de textos. ¿Enqué sentidos?. Dos esencialmente: sencillez para establecer las sentencias (líneas de código) y rapidez de ejecución.

De entre las monerías del AWk podemos enumerar cuatro muy interesantes: generación de reportes, búsqueda de patrones, validación de datos y ftrado de datos para transmisiones.

Estructura del código en AWK
Un programa en AWK es simplemente una secuencia de sentencias de la forma patrón { acción }. El AWK corre sobre un conjunto de archivos de entrada, su operación básica recae en la búsqueda de líneas de entrada en orden, una a la vez. En cada línea se busca por el patrón descrito en el programa, si se halla en la línea de entrada se ejecuta una acción correspondiente. De este modo se garantiza la ejecución de las sentencias para todas las líneas de entrada. Ahora, debido a que tanto los patrones como las sentencias son opcionales, las acciones se escriben dentro de llaves para distinguirse de los patrones.

Por ejemplo: |x| {print} imprime cada línea de entrada quecontenga una x.

Como cualquier lenguaje común y corriente cualquier programa escrito en AWK tiene la siguiente estructura:

Una sección BEGIN que se ejecute antes de que cualquier línes de entrada sea leída.
Una sección principal o de registros la cual se ejecuta una y otra ves para cada una de las líneas de entrada y, finalmente:
Una sección END que se ejecuta después de quie se han procesado todos los archivos de entrada.
Unidades léxicas
Todos los programas en AWK se componen de unidades léxicas llamadas tokens o marcas y exísten ocho tipos diferentes:
  1. Constantes numéricas. Pueden ser decimales o constantes de punto flotante.
  2. Constantes de cadena (string). Cualquier secuencia de caracteres dentro de comillas dobles ("Hola"). Una doble comilla va precedida por un backslash (\), como en: "Y ordenó: \"¡Sentados!\". En el caso de una nueva línea se usa el caracter \n como en C. Ningún otro caracter requiere de formato especial.

  3. Palabras clave o reservadas.
  4. Identificadores. Los identificadores en AWK sirven para denotar variables y arreglos. Un identificador es cualquier secuencia de letras, dígitos y guiones bajos (uunderscore "_"), que deben comenzar con una letra o un guión bajo y en donde se diferencian los caracteres en mayúsculas de aquellos en minúsculas.

    BEGIN break int while
    END close length
    FILENAME continue log
    FS exit next
    NF exp number
    NR for print
    OFS getline split
    ORS if sqrt
    OFMT in string
    RS index substr
Figura 1. Identificadores.
  1. Operadores. AWK tiene operadores de asignación, aritméticos, relacionales y lógicos como los del lenguaje C; así como operadores de reconocimiento de patrones similares a los de egrep y lex.

  2. Marcas de registro y campos. El símbolo $0 es una variable especial cuyo valor es el del registro de entrada actual. Este registro equivale a la línea de entrada que mencioné al inicio. $1, $2,...,$n son más variables especiales en las cuales se guardan los campos del registro actual ($0). La marca de separación de campos que emplea AWK por omisión es cualquier espacio en blanco. La palabra reservada NF (Number of Fields) contiene el número de campos que contiene el registro actual ($0), de modo que si $NF tiene un valor de 4 entónces $0 contiene únicamente $1, $2, $3 y $4. La palabra reservada RS (Record Separator) contiene el valor del separador de registros por omisión que emplea AWK el cual es un caracter de nueva línea. Esta variable puede cambiarse ajustando una simple asignación: RS="c". De manera similar exíste una variable para almacenar el separador de campos FS (Field Separator). Inicialmente el valor de FS es el espacio en blanco (\b). Para cambiar este valor por omisión sencillamente hay que realizar una asignación FS="c" de que este valor sea diferente de espacio en blanco, entónces habrá un campo en el registro a cada lado del separador. Por ejemplo, si el separadopr de campo es 1, el registro 1XXX1 tiene tres campos. El primero y el último son nulos. Si el separador de campo es blanco, entónces los campos se separan por espacios en blanco y ninguno de los NF son nulos. La asignación RS=" " hace que una línea en blanco se convierta en separador de registro. De este modo logramos crear registros de más de una línea o registros multilíneas. Y para finalizar tenemos la salida de registros y separadores de campo. El valor de ORS (Output Record Separator) se pone al final de cada registro. Inicialmente ORS tiene el valor de \n y OFS equivale al espacio en blanco.

  3. Comentarios. Los comentarios en AWK son de la forma más sencilla posible: # Esto es un comentario.
  4. Marcas de agrupamiento. Todas las marcas en AWK se separan usuarlmente por espacios en blanco, marcas de nueva línea; o por símbolos de puntuación taes como (, y ;). Las llaves ({...}) encierran las acciones; los slashes (|..|) circundan los patrones de expresiones regulares y las comillas dobles ("...") delimitan las constantes de cadena

Bibliografía
UNIX System V. Programmer's Manual. AT&T. 1989



Artículo original