1. Introducción a los entornos de trabajo UNIX

1.13. El lenguaje de procesado de archivos GAWK

1.13.2. Conceptos fundamentales

El comando gawk es una herramienta capaz de ejecutar un bloque de código sobre atributos individuales de cada registro almacenado en las líneas de un archivo de texto. Al procesar los datos, es posible generar una nueva línea de resultados, que se puede mostrar por pantalla o guardar en un nuevo archivo de texto.

El comando gawk recorre el contenido del archivo de texto línea por línea, separando automáticamente los distintos componentes de estas. El usuario tiene acceso a variables predefinidas que proporcionan información selectiva (ver tabla 11) y puede acceder a cada columna de una línea a través de su posición.

Tabla 11. Variables especiales de «awk».

Variable Descripción
$0 Contiene el contenido del registro de entrada
$1 Primer campo
$2 Segundo campo, y así sucesivamente
NF Number of fields. Número de campos (número de columnas)
FS Separador de campo de entrada
OFS Separador de campo de salida
NR Number of records. Número de registros (número de líneas)
RS Separador de registro de entrada
ORS Separador de registro de salida
Filename Nombre del archivo de entrada actualmente en procesamiento.

Fuente: elaboración propia.

Importante: por defecto, el separador de campos es el espacio en blanco, y el separador de registros es el salto de línea.

En general, al intérprete de comandos gawk se le suministran dos tipos de datos:

  • un fichero de órdenes o programa,
  • uno o más archivos de entrada.

Un fichero de órdenes (que puede ser un fichero como tal, o puede presentarse al invocar gawk desde la línea de comandos) contiene una serie de sentencias que le indican a gawk cómo procesar el fichero de entrada. Es decir, contiene el programa escrito en sintaxis GAWK.

$ gawk 'programa_GAWK' archivo1 archivo2 …
$ gawk -f 'archivo_con_código_GAWK' archivo1 archivo2

A continuación, tenemos varios ejemplos. Primero se genera un archivo in situ con secuencias en formato FASTA y con líneas en blanco entre ellas.

$ echo -e  ">seq01\nACCTAT\n\n>seq02\nCACCGA\n\n>seq03\nAAAACAGAG\n\n" > secuencias.txt

# Visualizamos el fichero contando las líneas con la opción -n

$ cat -n secuencias.txt
1    >seq01
2    ACCTAT
3 

4    >seq02

5    CACCGA

6 

7    >seq03

8    AAAACAGAG

9 

10

# Se utiliza gawk para imprimir solo las líneas que contengan al menos un campo no vacío

$ gawk 'NF > 0' secuencias.txt | nl
1   >seq01

2   ACCTAT

3   >seq02

4   CACCGA

5   >seq03

6   AAAACAGAG

# Imprime las primeras 7 líneas

$ gawk 'NR <= 7' secuencias.txt | cat -n
1   >seq01

2   ACCTAT

3

4   >seq02

5   CACCGA

6

7   >seq03

# Imprime las dos primeras líneas y a partir de la sexta; además, elimina los registros vacíos. En este caso el uso de los paréntesis consigue que se cumplan las dos condiciones

$ gawk 'NF > 0 && (NR <= 2 || NR >= 6)' secuencias.txt
>seq01

ACCTAT

>seq03

AAAACAGAG

En el campo de la bioinformática, el fichero de entrada está normalmente estructurado con un formato tabla, por defecto con campos separados por espacios o tabuladores (tablas). Se muestran ejemplos con el comando gawk de las posibilidades de acción de este comando.

Copia en tu terminal el fichero mostrado a continuación y llámalo ensamble.txt

#assembly_accession  organism_name   seq_rel_date    asm_name   submitter

GCA_000004195.4 Drosophila melanogaster    2021-07-01 dm6  NCBI

GCA_011586765.1 Arabidopsis thaliana 2022-04-11 Araport11  NCBI

GCA_009859395.1 Mus musculus    2022-02-08 GRCm39    NCBI

GCA_004115215.2 Caenorhabditis elegans     2022-03-16 WBcel235   NCBI

GCA_016590495.1 Rattus norvegicus    2022-02-25 Rnor_6.0   NCBI

GCA_009722195.1 Xenopus tropicalis   2022-01-24 Xenopus_tropicalis_v9.1    NCBI

GCA_017527675.1 Phaeodactylum tricornutum  2022-03-24 Phatr3.0   NCBI

GCA_011586775.1 Xenopus tropicalis   2022-04-11 Xenbase_v9.2    NCBI
$ head -3 ensamble.txt
GCA_000004195.4 Drosophila melanogaster    2021-07-01 dm6 
NCBI GCA_011586765.1 Arabidopsis thaliana 2022-04-11 Araport11
NCBI GCA_009859395.1 Mus musculus    2022-02-08 GRCm39    NCBI

# Imprime la primera, la segunda, la cuarta y la última columna del fichero

$ gawk 'BEGIN{FS="\t"} {print $1, $2, $4, $NF}' ensamble.txt
GCA_000004195.4 Drosophila melanogaster dm6 NCBI

GCA_011586765.1 Arabidopsis thaliana Araport11  NCBI

GCA_009859395.1 Mus musculus GRCm39 NCBI

GCA_004115215.2 Caenorhabditis elegans     WBcel235 NCBI

GCA_016590495.1 Rattus norvegicus Rnor_6.0 NCBI

GCA_009722195.1 Xenopus tropicalis Xenopus_tropicalis_v9.1 NCBI

GCA_017527675.1 Phaeodactylum tricornutum Phatr3.0 NCBI

GCA_011586775.1 Xenopus tropicalis Xenbase_v9.2 NCBI

# Si se indica que el separador de campo de la salida OFS sea también un tabulador, la estructura final del archivo se parecerá al de entrada

$ gawk 'BEGIN{FS="\t"; OFS=FS} {print $1, $2, $4, $NF}' ensamble.txt
GCA_000004195.4 Drosophila melanogaster    dm6  NCBI

GCA_011586765.1 Arabidopsis thaliana Araport11  NCBI

GCA_009859395.1 Mus musculus         GRCm39     NCBI

GCA_004115215.2 Caenorhabditis elegans     WBcel235   NCBI

GCA_016590495.1 Rattus norvegicus    Rnor_6.0   NCBI

GCA_009722195.1 Xenopus tropicalis   Xenopus_tropicalis_v9.1    NCBI

GCA_017527675.1 Phaeodactylum tricornutum  Phatr3.0   NCBI

GCA_011586775.1 Xenopus tropicalis   Xenbase_v9.2    NCBI

# Se realiza una búsqueda literal en este fichero

$ gawk 'BEGIN{FS="\t"; OFS=FS} /tropicalis/ {print $1, $2, $4, $NF}' ensamble.txt
GCA_009722195.1 Xenopus tropicalis   Xenopus_tropicalis_v9.1    NCBI

GCA_011586775.1 Xenopus tropicalis   Xenbase_v9.2    NCBI

# Se realiza una búsqueda literal de ausencia

$ gawk 'BEGIN{FS="\t"; OFS=FS} '\!/e/' {print $1, $2, $4, $NF}' ensamble.txt
GCA_011586765.1 Arabidopsis thaliana Araport11  NCBI

GCA_009859395.1 Mus musculus         GRCm39     NCBI

Si buscas dominar gawk, es crucial que aprendas a manejar correctamente las variables NR, FS y OFS. Los ejemplos anteriores te darán una comprensión profunda de su comportamiento por defecto, así como de cómo manipularlas para modelar adecuadamente la estructura de los registros de datos. Por lo tanto, te recomendamos que los estudies con detenimiento.