El comando gawk es la versión GNU de awk. Gawk es una poderosa herramienta de procesamiento de texto y manipulación de datos con muchas funciones y usos prácticos.
Esta guía te enseñará a usar el comando gawk de Linux con ejemplos.
Sintaxis del comando gawk en Linux
La sintaxis básica de gawk es la siguiente:
gawk [opciones] [acciones/filtros] archivo_de_entrada
El comando no se puede ejecutar sin ningún argumento. Las opciones no son obligatorias, pero para que gawk produzca una salida, se debe asignar al menos una acción. Las acciones y los filtros son diferentes subcomandos y criterios de selección que permiten a gawk manipular datos del archivo de entrada.
Nota: Encierra las opciones y las acciones entre comillas simples.
Opciones de gawk
El comando gawk es una herramienta versátil gracias a sus numerosos argumentos. Siendo gawk la implementación GNU de awk, están disponibles opciones largas al estilo GNU. Cada opción larga tiene una opción corta correspondiente.
A continuación se presentan las opciones comunes:
Opción | Descripción |
---|---|
-f archivo-programa , --file archivo-programa | Lee comandos de un archivo, que sirve como script, en lugar del primer argumento en la terminal. |
-F fs , --field-separator fs | Usa la variable predefinida fs como separador de campos de entrada. |
-v var=val , --assign var=val | Asigna un valor a la variable antes de ejecutar un script. |
-b , --characters-as-bytes | Trata todos los datos como caracteres de un solo byte. |
-c , --traditional | Ejecuta gawk en modo de compatibilidad. |
-C , --copyright | Muestra el mensaje de copyright de GNU. |
-d[archivo] , --dump-variables[=archivo] | Muestra una lista de variables, sus tipos y valores. |
-e texto-programa , --source texto-programa | Permite la mezcla de funciones de biblioteca y código fuente. |
-E archivo , --exec archivo | Desactiva las asignaciones de variables de terminal. |
-L [valor] , --lint[=valor] | Imprime mensajes de advertencia sobre código no portable a otras implementaciones de AWK. |
-S , --sandbox | Ejecuta gawk en modo sandbox. |
Variables integradas de gawk
El comando gawk ofrece varias variables integradas que se utilizan para almacenar y agregar valor al comando. Las variables se manipulan desde la terminal y solo afectan al programa cuando un usuario les asigna un valor. Algunas variables integradas importantes de gawk son:
Variable | Descripción |
---|---|
ARGC | Muestra el número de argumentos de terminal. |
ARGIND | Muestra el índice del archivo ARGV. |
ARGV | Presenta una matriz de argumentos de terminal. |
ERRNO | Contiene cadenas que describen un error del sistema. |
FIELDWIDTHS | Muestra la lista separada por espacios en blanco de los anchos de campo. |
FILENAME | Imprime el nombre del archivo de entrada. |
FNR | Muestra el número de registro de entrada. |
FS | Representa el separador de campos de entrada. |
IGNORECASE | Activa o desactiva la búsqueda con distinción de mayúsculas y minúsculas. |
NF | Imprime el recuento de campos del archivo de entrada. |
NR | Imprime el recuento de líneas del archivo actual. |
OFS | Muestra el separador de campos de salida. |
ORS | Muestra el separador de registros de salida. |
RS | Imprime el separador de registros de entrada. |
RSTART | Representa el índice del primer carácter coincidente. |
RLENGTH | Representa la longitud de la cadena coincidente. |
Ejemplos de gawk
El uso de las funciones de coincidencia de patrones y procesamiento de lenguaje de gawk
es extenso. Este artículo tiene como objetivo proporcionar ejemplos prácticos a través de los cuales los usuarios aprenden a usar la utilidad gawk.
Importante: El comando
gawk
distingue entre mayúsculas y minúsculas. Usa la variableIGNORECASE
para ignorar las mayúsculas y minúsculas.
Imprimir archivos
De forma predeterminada, gawk
con un argumento print
muestra cada línea del archivo especificado. Por ejemplo, ejecutar el comando cat en el archivo de texto personas.txt
imprime lo siguiente:
1. Sofía García 1996
2. Diego López 2001
3. Valeria Hernández 2004
4. Mateo Rodríguez 1998
5. Isabella Pérez 2002
6. Javier Sánchez 2006
7. Camila Díaz 1999
8. Lucas Morales 2005
9. Daniela Torres 1997
10. Andrés Castillo 2003
El comando gawk muestra el mismo resultado:
gawk '{print}' personas.txt
1. Sofía García 1996
2. Diego López 2001
3. Valeria Hernández 2004
4. Mateo Rodríguez 1998
5. Isabella Pérez 2002
6. Javier Sánchez 2006
7. Camila Díaz 1999
8. Lucas Morales 2005
9. Daniela Torres 1997
10. Andrés Castillo 2003
Imprimir una columna
En los archivos de texto, los espacios suelen utilizarse como delimitadores para las columnas. El archivo personas.txt
consta de cuatro columnas:
- Números ordinales.
- Nombres.
- Apellidos.
- Año de nacimiento.
Usa gawk para mostrar solo una columna específica en la terminal. Por ejemplo:
gawk '{print $2}' personas.txt
Sofía
Diego
Valeria
Mateo
Isabella
Javier
Camila
Lucas
Daniela
Andrés
El comando imprime solo la segunda columna. Para imprimir varias columnas, como la columna uno (números ordinales) y la columna dos (nombres), ejecuta:
gawk '{print $1, $2}' personas.txt
1. Sofía
2. Diego
3. Valeria
4. Mateo
5. Isabella
6. Javier
7. Camila
8. Lucas
9. Daniela
10. Andrés
El comando gawk también funciona sin la coma entre $1
y $2
. Sin embargo, no hay espacios entre las columnas en la salida:
gawk '{print $1 $2}' personas.txt
1.Sofía
2.Diego
3.Valeria
4.Mateo
5.Isabella
6.Javier
7.Camila
8.Lucas
9.Daniela
10.Andrés
Filtrar columnas
El comando gawk ofrece opciones de filtrado adicionales. Por ejemplo, imprime las líneas que contienen la letra mayúscula O con:
gawk '/L/ {print}' personas.txt
2. Diego López 2001
8. Lucas Morales 2005
Para mostrar solo las líneas que contienen las letras L o S, usa tuberías:
gawk '/L\|S/ {print}' personas.txt
1. Sofía García 1996
2. Diego López 2001
6. Javier Sánchez 2006
8. Lucas Morales 2005
El comando imprime cualquier línea que incluya una palabra con L mayúscula o S mayúscula. Por otro lado, usa la Y lógica (&&
) para mostrar las líneas que incluyen tanto O como el año 1995:
gawk '/C/ && /1999/' personas.txt
7. Camila Díaz 1999
Los filtros también funcionan con números. Por ejemplo, muestra solo las personas nacidas en la década de 1990 con:
gawk '/199*/ {print}' personas.txt
1. Sofía García 1996
4. Mateo Rodríguez 1998
7. Camila Díaz 1999
9. Daniela Torres 1997
La salida muestra solo las líneas en las que la cuarta columna incluye el valor 199.
Personaliza aún más la salida combinando las opciones mencionadas anteriormente. Por ejemplo, imprime solo los nombres y apellidos de las personas nacidas en 1995 o 2003 con:
gawk '/1995\|2003/ {print $2, $3}' personas.txt
Andrés Castillo
El comando imprime las columnas dos y tres como se indica en la parte {print $2, $3}
. La salida solo muestra las líneas que contienen los números 1995 y 2003, aunque las columnas que contienen esos números están ocultas.
El comando gawk
también permite a los usuarios imprimir todo excepto las líneas que contienen la cadena especificada con la NO lógica (!). Por ejemplo, omite las líneas que contienen la cadena 19 en la salida:
gawk '!/19/' personas.txt
2. Diego López 2001
3. Valeria Hernández 2004
5. Isabella Pérez 2002
6. Javier Sánchez 2006
8. Lucas Morales 2005
10. Andrés Castillo 2003
Agregar números de línea
El archivo personas.txt
incluye números de línea en la primera columna. En caso de que los usuarios estén trabajando en un archivo sin números de línea, gawk presenta opciones para agregarlos.
Por ejemplo, el archivo humanos.txt
no incluye ningún número ordinal:
Sofía García
Diego López
Valeria Hernández
Mateo Rodríguez
Isabella Pérez
Javier Sánchez
Camila Díaz
Lucas Morales
Daniela Torres
Andrés Castillo
Para agregar números de línea, ejecuta gawk
con FNR
y next
:
gawk '{ print FNR, $0; next}' humanos.txt
1 Sofía García
2 Diego López
3 Valeria Hernández
4 Mateo Rodríguez
5 Isabella Pérez
6 Javier Sánchez
7 Camila Díaz
8 Lucas Morales
9 Daniela Torres
10 Andrés Castillo
El comando agrega un número de línea antes de cada línea. Se obtiene el mismo resultado con la variable NR
:
gawk '{print NR, $0}' humanos.txt
Encontrar el conteo de líneas
Para contar el número total de líneas en el archivo, usa la instrucción END
y la variable NR
con gawk:
gawk 'END { print NR }' personas.txt
10
El comando lee cada línea. Una vez que gawk llega a END
, imprime el valor de NR
, que contiene el número total de líneas. Ejecutar el mismo comando sin la instrucción END
imprime solo el valor de NR
: el número de líneas.
gawk '{ print NR }' personas.txt
1
2
3
4
5
6
7
8
9
10
Filtrar líneas basadas en la longitud
Usa la siguiente opción de comando para imprimir solo las líneas de más de 20 caracteres:
gawk 'length>20' personas.txt
3. Valeria Hernández 2004
4. Mateo Rodríguez 1998
6. Javier Sánchez 2006
8. Lucas Morales 2005
10. Andrés Castillo 2003
También funciona con múltiples argumentos. Por ejemplo, muestra líneas de más de 17 pero menos de 20 caracteres:
gawk 'length<20 && length>17' personas.txt
2. Diego López 2001
Para mostrar líneas que tienen exactamente 20 caracteres de longitud, ejecuta:
gawk 'length==20' personas.txt
Imprimir información basada en condiciones
El comando gawk permite el uso de las instrucciones if-else
. Por ejemplo, otra forma de filtrar solo a las personas nacidas después de 1999 es con una simple instrucción if
:
gawk '{ if ($4>1999) print }' personas.txt
2. Diego López 2001
3. Valeria Hernández 2004
5. Isabella Pérez 2002
6. Javier Sánchez 2006
8. Lucas Morales 2005
10. Andrés Castillo 2003
La instrucción if
establece la condición de que las entradas en la columna cuatro deben ser mayores que 1999. La salida muestra solo las entradas que cumplen la condición. Expande el comando en una instrucción if-else
para imprimir las líneas que no cumplen la condición original.
gawk '{if ($4>1999) print $0," ==>00s"; else print $0, "==>90s"}' personas.txt
1. Sofía García 1996 ==>90s
2. Diego López 2001 ==>00s
3. Valeria Hernández 2004 ==>00s
4. Mateo Rodríguez 1998 ==>90s
5. Isabella Pérez 2002 ==>00s
6. Javier Sánchez 2006 ==>00s
7. Camila Díaz 1999 ==>90s
8. Lucas Morales 2005 ==>00s
9. Daniela Torres 1997 ==>90s
10. Andrés Castillo 2003 ==>00s
El comando incluye:
- Instrucción
if
. Si se cumple la condición, gawk agrega la cadena “==>90s” a la línea de salida. - Instrucción
else
. En caso de que la línea no satisfaga la condición, gawk aún imprime esa línea en la salida, agregando la cadena “==>00s” a la salida.
Agregar un encabezado
De la misma manera en que la instrucción END
permite a los usuarios modificar la salida al final del archivo, la instrucción BEGIN
formatea los datos al principio.
Cuando se usa con awk, las secciones BEGIN
siempre se ejecutan primero. Después de eso, awk ejecuta las líneas restantes. Una forma de usar la instrucción BEGIN
es agregar un encabezado a la salida.
Ejecuta el siguiente comando para agregar una sección encima de la salida de awk:
gawk 'BEGIN {print "No/Nombre y Apellido/Año de Nacimiento"} {print $0}' personas.txt
No/Nombre y Apellido/Año de Nacimiento
1. Sofía García 1996
2. Diego López 2001
3. Valeria Hernández 2004
4. Mateo Rodríguez 1998
5. Isabella Pérez 2002
6. Javier Sánchez 2006
7. Camila Díaz 1999
8. Lucas Morales 2005
9. Daniela Torres 1997
10. Andrés Castillo 2003
Encontrar la longitud de línea más larga
Combina los argumentos anteriores con las instrucciones if
y END
para encontrar la línea más larga en el archivo personas.txt
:
gawk '{ if (length($0) > max) max = length($0) } END { print max }' personas.txt
26
Encontrar el número de campos
El comando gawk también permite a los usuarios mostrar el número de campos con la variable NF
. La forma más sencilla de mostrar el número de campos imprime una salida difícil de leer:
gawk '{print NF}' personas.txt
4
4
4
4
4
4
4
4
4
4
El comando genera el número de campos por línea sin ninguna información adicional. Para personalizar la salida y hacerla más legible, ajusta el comando inicial:
gawk '{print NR, "-->", NF}' personas.txt
1 --> 4
2 --> 4
3 --> 4
4 --> 4
5 --> 4
6 --> 4
7 --> 4
8 --> 4
9 --> 4
10 --> 4
El comando ahora incluye:
- La variable
NR
que agrega números de línea a cada línea de salida. - La cadena “–>” que separa los números de línea de los números de campo.
Otra forma de mostrar los números de línea y campo en el archivo personas.txt
es imprimir columnas con NF
. Ten en cuenta que el archivo personas.txt
incluye números ordinales en la columna uno. Por lo tanto, la variable NR
se omite:
gawk '{print $0, "-->", NF}' personas.txt
1. Sofía García 1996 --> 4
2. Diego López 2001 --> 4
3. Valeria Hernández 2004 --> 4
4. Mateo Rodríguez 1998 --> 4
5. Isabella Pérez 2002 --> 4
6. Javier Sánchez 2006 --> 4
7. Camila Díaz 1999 --> 4
8. Lucas Morales 2005 --> 4
9. Daniela Torres 1997 --> 4
10. Andrés Castillo 2003 --> 4
Finalmente, para imprimir el número total de campos, ejecuta:
gawk '{num_fields = num_fields + NF} END {print num_fields}' personas.txt
40
El archivo tiene diez líneas y cuatro columnas. Por lo tanto, la salida es correcta.
Conclusión
Después de completar este tutorial, sabes cómo usar gawk para el procesamiento avanzado de texto y la manipulación de datos.
También considera usar grep, una poderosa herramienta de Linux para buscar cadenas, palabras y patrones.
¿Qué te parece?
Es bueno conocer tu opinión. Deja un comentario.