Comenzando con AWK
Como decíamos en una entrada anterior, AWK es un lenguaje de programación expresivo y que resulta conveniente para ser usado en una amplia variedad de tareas de computación y manipulación de datos.
Comenzando
Prácticamente cualquier SO unix-like moderno viene con al menos una de las implementaciones de AWK instalada (awk, gawk, mawk, nawk, mks, awka, etc), por lo cual, si usamos uno de estos SOs no necesitamos instalar nada.
Supongamos que tenemos un archivo llamado emp.data que contiene, un registro por línea, los sgtes. campos:
Ahora, se quiere imprimir el nombre y el pago para todos los empleados que trabajaron más de 0 horas. Este es el tipo de trabajos para el que fue pensado awk, así que es fácil.
Poniendo en un archivo llamado emp.awk la sgte. linea:
¿Cómo funciona?
La línea que pusimos en el archivo emp.awk es una sentencia patrón-acción. El patrón ($3 > 0), matchea con cada línea de entrada cuya tercer columna, o field, es mayor a 0, y la acción
Ahora ¿qué pasa si queremos imprimir el nombre de los empleados que no han trabajado?
Debería cambiar el patrón para que matchee aquellas líneas cuyo tercer campo es 0 ($3 == 0) y asociar a esas líneas la acción:
Estructura de un programa AWK
Entremos un poco en el detalle de lo que está pasando. Cada programa AWK es una secuencia de uno o más enunciados patrón-acción, de la sgte. manera:
Cada línea de entrada, en su turno, es probada respecto a cada patrón. Para cada patrón que se cumpla, se produce la acción correspondiente (que puede implicar varios pasos).
Después, se lee la próxima línea y todo comienza de nuevo. Esto se repite hasta que no hayan más lineas de entrada por leer.
El patrón o la acción (pero no ambos) pueden ser omitidos en los enunciados patrón-acción. Si un patrón no tiene acción, por ejemplo en:
Si usamos como entrada el mismo archivo emp.data, tendríamos un resultado como lo sgte.:
En el caso de que tengamos una accion sin un patrón asociado, por ej:
La razón por la cuál las acciones están encerradas entre llaves, es justamente, el hecho de que tanto el patrón como la acción sean opcionales.
Eso es todo por hoy.
Esta entrada es parte de una traducción/apunte/resumen del libro, escrito por los autores de AWK, llamado The AWK Programming Language
Comenzando
Prácticamente cualquier SO unix-like moderno viene con al menos una de las implementaciones de AWK instalada (awk, gawk, mawk, nawk, mks, awka, etc), por lo cual, si usamos uno de estos SOs no necesitamos instalar nada.
Supongamos que tenemos un archivo llamado emp.data que contiene, un registro por línea, los sgtes. campos:
- Nombre del empleado
- Honorarios por hora en pesos
- Número de horas trabajadas
Beto 100 0
Daniel 75 0
Milagro 100 10
Marcos 125 20
Marías 130 22
Susana 80 18
Ahora, se quiere imprimir el nombre y el pago para todos los empleados que trabajaron más de 0 horas. Este es el tipo de trabajos para el que fue pensado awk, así que es fácil.
Poniendo en un archivo llamado emp.awk la sgte. linea:
$3 > 0 { print $1, $2 * $3 }
e invocando el script desde la consola con:awk -f emp.awk emp.dataDeberíamos obtener el sgte. resultado:
Milagro 1000
Marcos 2500
Marías 2860
Susana 1440
¿Cómo funciona?
La línea que pusimos en el archivo emp.awk es una sentencia patrón-acción. El patrón ($3 > 0), matchea con cada línea de entrada cuya tercer columna, o field, es mayor a 0, y la acción
{ print $1, $2 * $3 }
imprime el primer field y el producto del segundo y el tercer field para cada línea que ha matcheado el patrón.Ahora ¿qué pasa si queremos imprimir el nombre de los empleados que no han trabajado?
Debería cambiar el patrón para que matchee aquellas líneas cuyo tercer campo es 0 ($3 == 0) y asociar a esas líneas la acción:
{ print $1 }
ya que es la primera columna la que se corresponde con el nombre del empleado. De esta manera, obtendría el sgte. resultado:
Beto
Daniel
Estructura de un programa AWK
Entremos un poco en el detalle de lo que está pasando. Cada programa AWK es una secuencia de uno o más enunciados patrón-acción, de la sgte. manera:
patrón1 {acción1}
patrón2 {acción2}
...
La operación básica de awk es revisar las línea de entrada, una después de otra, buscando líneas que matcheen con cualquiera de los patrones del programa. El significado preciso de "matchear" depende del patrón en sí; para patrones como "\$3 > 0" significa "Matchear si la condición es cierta".Cada línea de entrada, en su turno, es probada respecto a cada patrón. Para cada patrón que se cumpla, se produce la acción correspondiente (que puede implicar varios pasos).
Después, se lee la próxima línea y todo comienza de nuevo. Esto se repite hasta que no hayan más lineas de entrada por leer.
El patrón o la acción (pero no ambos) pueden ser omitidos en los enunciados patrón-acción. Si un patrón no tiene acción, por ejemplo en:
$3 == 0
se imprimen las líneas donde el patrón matchee, es decir, donde la condición es cierta.Si usamos como entrada el mismo archivo emp.data, tendríamos un resultado como lo sgte.:
Beto 100 0
Daniel 75 0
En el caso de que tengamos una accion sin un patrón asociado, por ej:
{print $1}
La acción es aplicada a todas las líneas de entrada.La razón por la cuál las acciones están encerradas entre llaves, es justamente, el hecho de que tanto el patrón como la acción sean opcionales.
Eso es todo por hoy.
Esta entrada es parte de una traducción/apunte/resumen del libro, escrito por los autores de AWK, llamado The AWK Programming Language
Comentarios
Publicar un comentario