AWK es un lenguaje de programación diseñado para procesar datos basados en texto, ya sean ficheros o flujos de datos. El nombre AWK deriva de las iniciales de los apellidos de sus autores: Alfred Aho, Peter Weinberger, y Brian Kernighan. awk, cuando está escrito todo en minúsculas, hace referencia al programa de Unix o Plan 9 que interpreta programas escritos en el lenguaje de programación AWK (Wikipedia, 2024).
Continuando con ésta serie nos enfocaremos en éste comando. Nuestra guía y referencia de estudio es éste cheatsheet (conocidos como chuleta o chivo, en español) y como texto objetivo usaremos el poema Hay Un País en el Mundo, del poeta nacional (dominicano) Pedro Mir (1913-2000).
En la mayoría de distribuciones GNU/Linux actuales, awk viene como la implementación del lenguaje de programación AWK del Proyecto GNU, llamada gawk. Sin embargo ésto no lo notamos porque el comando awk ubicado en /usr/bin/awk es un enlace simbólico a /usr/bin/gawk.
gawk se ajusta a la definición del lenguaje en el estándar POSIX 1003.1. y a su vez, se basa en la descripción de The AWK Programming Language, de Aho, Kernighan y Weinberger. gawk proporciona las características adicionales que se encuentran en la versión actual de awk de Brian Kernighan y numerosas extensiones específicas de GNU (Wikipedia, 2024).
Sintaxis del comando awk:
$ awk 'patrón {acción}' archivo
- patrón: Define qué líneas o campos deben coincidir.
- acción: Especifica qué hacer con las coincidencias.
Para encontrar todas las líneas que contienen la palabra "mundo":
$ awk '/mundo/' hay-un-pais-en-el-mundo.txt
- "mundo" sería una RegEx muy simple.
Imprimir las líneas que comienzan con una vocal:
$ awk '/^[AEIOUaeiou]/d' hay-un-pais-en-el-mundo.txt
- Aquí, ^ indica el inicio de la línea, y [AEIOUaeiou] es la RegEx que busca líneas que comiencen con cualquier vocal.
Para encontrar y mostrar todas las palabras de más de 8 caracteres en el poema:
$ awk '{for(i=1;i<=NF;i++) if(length($i)>8) print $i} hay-un-pais-en-el-mundo.txt
- NF: Número de campos en la línea actual.
- length($i): Calcula la longitud de cada palabra.
$ awk '/\b(\w+)\s+\1\b/ {count++} END {print count}' hay-un-pais-en-el-mundo.txt
- \b(\w+)\s+\1\b: Busca palabras que se repiten consecutivamente.
- count++: Incrementa un contador para cada coincidencia.
$ awk '{gsub(/país/, "nación"); print}' hay-un-pais-en-el-mundo.txt
- gsub(/país/, "nación"): Sustituye todas las ocurrencias de "país" por "nación".
Opciones útiles de awk para regex
- -F Separador de campos: Define el delimitador de campos, útil para trabajar con archivos CSV.
- BEGIN y END: Permite ejecutar acciones antes de leer el archivo o después de procesarlo.
Ejemplo con BEGIN y END
Mostrar un encabezado antes de procesar las líneas y un resumen al final:
$ awk 'BEGIN {print "Procesando poema...\n"} /mundo/ {print} END {print "\nFin del procesamiento"}' hay-un-pais-en-el-mundo.txt
Usar awk con regex abre un abanico de posibilidades para realizar manipulaciones avanzadas en archivos de texto. A través de estos ejemplos aplicados al poema, es fácil ver cómo las expresiones regulares permiten transformar y adaptar texto de forma detallada y eficiente.
Puedes profundizar más sobre el comando awk al consultar su manual:
$ man awk
Oh wow, justo lo que buscaba
ResponderEliminar