¿Cómo escribir scripts utilizando el lenguaje de programación Awk?
Awk es un potente lenguaje de procesamiento de texto que lleva el nombre de sus tres autores originales: Alfred Aho, Peter Weinberger y Brian Kernighan. Es un lenguaje versátil que se utiliza principalmente para escanear y procesar patrones. Awk es un elemento básico de las secuencias de comandos Unix y se usa comúnmente para tareas como extracción de datos, informes y transformación de datos.
Los scripts de Awk se escriben rápidamente y funcionan bien para tareas pequeñas y medianas. En este artículo, le presentaremos los conceptos básicos de la escritura de scripts utilizando el lenguaje de programación Awk.
Sintaxis básica
Un programa Awk consta de una secuencia de pares patrón-acción, escrita como:
pattern { action }
Aquí el patrón es una condición. Si la línea de entrada coincide con el patrón, entonces se realiza la acción.
Por ejemplo -
awk '/search_pattern/ { print $0 }' file_name
En este ejemplo, awk buscará la línea que incluye patrón_búsqueda desde nombre_archivo y, si coincide, imprimirá la línea completa ($0).
Usando variables
Awk tiene variables integradas que puedes usar para formatear tu salida. Algunos de los más comunes son:
$0 - La línea completa.
$1, $2, ... − Cada campo individual (delimitado de forma predeterminada por espacios en blanco).
FS - Separador de campo (el valor predeterminado es un espacio).
OFS - Separador de campo de salida (el valor predeterminado es un espacio).
NR - Número de registros procesados.
NF - Número de campos en el registro actual.
Veamos un ejemplo práctico utilizando algunas de estas variables. Supongamos que tenemos un archivo de texto llamado 'students.txt' con el siguiente contenido:
John Doe 18
Jane Smith 19
Podemos usar awk para imprimir los nombres y las edades por separado:
awk '{ print "Name: " $1 " " $2 ", Age: " $3 }' students.txt
La salida será:
Name: John Doe, Age: 18
Name: Jane Smith, Age: 19
Flujo de control
Awk también admite mecanismos de flujo de control comunes como if, else, while y for. Aquí hay un ejemplo que usa if y else:
awk '{ if ($3 > 18) print $1 " is an adult"; else print $1 " is a minor"}' students.txt
La salida será:
John is an adult
Jane is a minor
Funciones
Awk tiene funciones integradas para manipulación de cadenas, operaciones aritméticas y entrada/salida, entre otras. También puede definir sus propias funciones.
A continuación se muestra un ejemplo de una función definida por el usuario que convierte temperaturas de Fahrenheit a Celsius:
function toCelsius(fahrenheit) {
return (fahrenheit - 32) * 5/9
}
BEGIN { print "Fahrenheit Celsius" }
{ print $1, toCelsius($1) }
Si tenemos un archivo de entrada 'temperatures.txt' con temperaturas Fahrenheit:
32
212
La salida será:
Fahrenheit Celsius
32 0
212 100
Expresiones regulares
Awk admite la sintaxis de expresiones regulares que se pueden utilizar en la coincidencia de patrones. Aquí hay un ejemplo básico en el que buscamos líneas en nuestro 'students.txt' que comienzan con la letra 'J':
awk '/^J/ { print $0 }' students.txt
En este caso, el símbolo de intercalación (^) representa el inicio de una línea. Este script generará:
John Doe 18
Jane Smith 19
matrices
Awk admite matrices unidimensionales que se pueden utilizar para manipulación de datos más compleja. Consideremos un caso en el que queremos contar la aparición de edades en nuestro archivo 'students.txt'. Así es como puedes hacerlo:
awk '{ count[$3]++ } END { for (age in count) print age " appears " count[age] " times." }' students.txt
Esto generará:
18 appears 1 times.
19 appears 1 times.
En este script, count[$3]++ usa la edad (tercer campo) como clave de la matriz e incrementa su valor cada vez que aparece.
Manipulación avanzada de datos
Awk también proporciona varias funciones integradas para una manipulación de datos más avanzada. Por ejemplo, proporciona la función split(), que puede dividir una cadena en una matriz:
awk '{ split($1, array, ""); print "First letter of the name: " array[1] }' students.txt
Este script generará:
First letter of the name: J
First letter of the name: J
Combinando Awk con otros comandos de Unix
Puede combinar scripts Awk con otros comandos de Unix usando tuberías (|), lo que la convierte en una herramienta aún más poderosa:
cat students.txt | awk '{ print $1 }' | sort | uniq
Este comando imprimirá los nombres de los estudiantes, los ordenará y luego eliminará los duplicados. En este caso, la salida será:
Jane
John
Usando secuencias de comandos en Awk
Si bien usar Awk directamente en la terminal es común para tareas simples, para operaciones más complejas puede ser más conveniente escribir scripts. Los scripts Awk siguen la misma estructura de patrón-acción, pero están escritos en un archivo separado.
Primero, cree un nuevo archivo con la extensión .awk. La línea superior del guión debe ser la línea shebang, que apunta al intérprete de Awk:
#!/usr/bin/awk -f
Creemos un script Awk llamado 'students.awk' que calcule la edad promedio de los estudiantes:
#!/usr/bin/awk -f
BEGIN {
sum = 0
count = 0
}
{
sum += $3
count++
}
END {
print "Average age: " sum/count
}
Para ejecutar el script, hágalo ejecutable con chmod +x Students.awk y luego ejecútelo con ./students.awk Students.txt. Esto imprimirá:
Average age: 18.5
Depuración de scripts Awk
Depurar scripts Awk puede ser un poco complicado debido a la falta de herramientas de depuración integradas. Sin embargo, puede resultar útil utilizar declaraciones impresas para mostrar el valor de las variables en diferentes puntos del script.
Además, la opción -W dump-variables[=file] se puede utilizar para volcar todas las variables y matrices en un archivo para su depuración. Para usar esta opción, ejecutaría awk -W dump-variables=dump.txt script.awk.
Coincidencia de patrones avanzada
Awk también admite la coincidencia de patrones avanzada con expresiones regulares. Por ejemplo, puede utilizar el operador ~ para hacer coincidir un campo con una expresión regular.
Considere un archivo Students.txt con un campo adicional para el curso que están estudiando:
John Doe 18 ComputerScience
Jane Smith 19 Mathematics
Para encontrar estudiantes que estudien Ciencias de la Computación, puede escribir:
awk '$4 ~ /ComputerScience/ { print $1 " " $2 " is studying Computer Science." }' students.txt
Esto generará:
John Doe is studying Computer Science.
Conclusión
Awk es una poderosa herramienta para el procesamiento de textos en sistemas basados en Unix. Su poder reside en su simplicidad y la naturaleza directa de su sintaxis. Ya sea que esté manipulando texto o realizando cálculos aritméticos, Awk es una excelente herramienta para tener en su kit de herramientas de programación.
Recuerde, la mejor manera de aprender Awk (o cualquier idioma) es usarlo. Intente crear sus propios scripts Awk, comenzando con tareas simples y avanzando gradualmente hacia otras más complejas a medida que se sienta más cómodo con el lenguaje.