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