El comando awk es un método muy útil para procesar o analizar archivos de texto en Linux. En particular, analiza los archivos de datos organizados por líneas (filas) y columnas. Los comandos awk simples se pueden ejecutar desde la línea de comandos. Las tareas más complejas deben escribirse como programas awk (llamados scripts awk) en un archivo. En este artículo te enseñaremos como escribir comandos y scripts AWK en Linux. No te vayas…
Conceptos básicos escribir comandos y scripts AWK
Este comando en particular proporciona un lenguaje de scripting para el procesamiento de texto con el cual podemos definir variables, utilizar cadenas y operadores aritméticos, utilizar control de flujo y ciclos y generar reportes con formato. Realmente, awk es más que un simple comando de procesamiento de patrones, pues en realidad es todo un lenguaje de análisis semántico.
El formato básico de un comando awk se ve de esta forma:
awk 'pattern {action}' input-file > output-file
Esto significa que toma cada línea del archivo de entrada; si la línea contiene el patrón, aplica la acción a la línea y escribe la línea resultante en el archivo de salida. Si se omitiera el patrón, la acción se aplicaría a todas las líneas. A continuación un ejemplo concreto:
awk '{ print $5 }' table1.txt > output1.txt
La instrucción anterior toma el elemento de la 5ta columna de cada línea y lo escribe como una línea en el archivo de salida «output.txt.» La variable ‘$4’ se refiere a la cuarta columna. Del mismo modo, se puede acceder a la primera, segunda y tercera columna, con $1, $2, $3, respectivamente. De forma predeterminada, se supone que las columnas están separadas por espacios o tabulaciones (los llamados espacios en blanco). Por lo tanto, si el archivo de entrada «table1.txt» contiene estas líneas deberá suceder:
1, Justin Timberlake, Title 545, Price $7.30 2, Taylor Swift, Title 723, Price $7.90 3, Mick Jagger, Title 610, Price $7.90 4, Lady Gaga, Title 118, Price $7.30 5, Johnny Cash, Title 482, Price $6.50 6, Elvis Presley, Title 335, Price $7.30 7, John Lennon, Title 271, Price $7.90 8, Michael Jackson, Title 373, Price $5.50
Luego ocurriría que el comando escribiría las siguientes líneas en el archivo de salida «output1.txt«:
545, 723, 610, 118, 482, 335, 271, 373,
Si el separador de columnas es distinto de espacios o pestañas, pudiera ser a través de una coma(,), puedes especificarlo en la instrucción awk de la siguiente forma:
awk -F, '{ print $3 }' table1.txt > output1.txt
Esto seleccionará el elemento de la columna 3 de cada línea si se considera que las columnas están separadas por una coma. Por lo tanto, la salida que se tomaría en este caso sería esta a continuación:
Title 545 Title 723 Title 610 Title 118 Title 482 Title 335 Title 271 Title 373
Expresiones condicionales en AWK
Las listas de instrucciones dentro de los corchetes (‘) se denominan bloques. Si colocas una expresión condicional delante de un bloque, la instrucción dentro del bloque se ejecutará solo si la condición es true. De esta manera:
awk '$7=="\$7.30" { print $3 }' table1.txt
En este caso, la condición es de $7 «$7.30», lo cual significa que el elemento de la columna 7 es igual a $7.30. Por lo tanto la barra diagonal invertida frente al signo de dólar es utilizada para evitar que el sistema interprete el $7 como una variable, y en su lugar tome el signo de dólar literalmente.
Así que esta instrucción awk imprimirá el elemento en la 3ra columna de cada línea que tiene un «$7.30» en la columna 7.
También puedes utilizar expresiones regulares como condición. A continuación un ejemplo:
awk '/30/ { print $3 }' table1.txt
La cadena entre las dos barras diagonales (‘/’) es la expresión regular. En este caso, es sólo la cadena «30.» Esto significa que si una línea contiene la cadena «30», el sistema imprime el elemento en la 3ra columna de esa línea. Por ejemplo la salida anterior sería:
Timberlake, Gaga, Presley,
¿Cómo realizar cálculos en AWK?
Si los elementos que hay dentro de la tabla son números, awk puede ejecutar cálculos en ellos como en este ejemplo a continuación:
awk '{ print ($2 * $3) + $7 }'
Además de las variables que acceden a los elementos de la fila actual ($1, $2, etc.), está la variable $0 que hace referencia a la fila completa (línea), y la variable NF que contiene el número de campos incluidos.
También puedes definir las nuevas variables como en este ejemplo a continuación:
awk '{ sum=0; for (col=1; col<=NF; col++) sum += $col; print sum; }'
Esto calculará e imprimirá la suma de todos los elementos de cada fila. Las instrucciones Awk se combinan con frecuencia con comandos sed.