jueves, 5 de diciembre de 2024

Introducción a Regular Expressions: El comando awk

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).

El comando awk.

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.

Para contar las líneas donde una palabra aparece consecutivamente:
$ 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.

Para reemplazar todas las apariciones de "país" por "nación":
$ 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

    1 comentario: