1. Introducció als entorns de treball UNIX

1.13. El llenguatge de processament d’arxius GAWK

1.13.2. Conceptes fonamentals

L’ordre gawk és una eina capaç d’executar un bloc de codi sobre atributs individuals de cada registre emmagatzemat en les línies d’un arxiu de text. En processar les dades, és possible generar una nova línia de resultats, que es pot mostrar per pantalla o guardar en un nou arxiu de text.

L’ordre gawk recorre el contingut de l’arxiu de text línia per línia, separant automàticament els diferents components d’aquestes. L’usuari té accés a variables predefinides que proporcionen informació selectiva (vegeu la taula 11) i pot accedir a cada columna d’una línia a través de la seva posició.

Taula 11. Variables especials d’«awk».

Variable Descripció
$0 Conté el contingut del registre d’entrada
$1 Primer camp
$2 Segon camp, i així successivament
NF Number of fields. Nombre de camps (nombre de columnes)
FS Separador de camp d’entrada
OFS Separador de camp de sortida
NR Number of records. Nombre de registres (nombre de línies)
RS Separador de registre d’entrada
ORS Separador de registre de sortida
Filename Nom de l’arxiu d’entrada actualment en processament.

Font: elaboració pròpia.

Important: per defecte, el separador de camps és l’espai en blanc, i el separador de registres és el salt de línia.

En general, a l’intèrpret d’ordres gawk se li subministren dos tipus de dades:

  • un fitxer d’ordres o programa,
  • un o més arxius d’entrada.

Un fitxer d’ordres (que pot ser un fitxer com a tal, o pot presentar-se en invocar gawk des de la línia d’ordres) conté una sèrie de sentències que li indiquen a gawk com processar el fitxer d’entrada. És a dir, conté el programa escrit en sintaxi GAWK.

$ gawk 'programa_GAWK' arxiu1 arxiu2 …
$ gawk -f 'arxiu_amb_codi_GAWK' arxiu1 arxiu2

A continuació, en tenim diversos exemples. Primer es genera un arxiu in situ amb seqüències en format FASTA i amb línies en blanc entre elles.

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

# Visualitzem el fitxer comptant les línies amb l’opció -n

$ cat -n seqüencia.txt
1    >seq01
2    ACCTAT
3 

4    >seq02

5    CACCGA

6 

7    >seq03

8    AAAACAGAG

9 

10

# S’utilitza gawk per imprimir només les línies que continguin almenys un camp no buit

$ gawk 'NF > 0' seqüencia.txt | nl
1   >seq01

2   ACCTAT

3   >seq02

4   CACCGA

5   >seq03

6   AAAACAGAG

# Imprimeix les primeres 7 línies

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

2   ACCTAT

3

4   >seq02

5   CACCGA

6

7   >seq03

# Imprimeix les dues primeres línies i a partir de la sisena; a més, elimina els registres buits. En aquest cas l’ús dels parèntesis aconsegueix que es compleixin les dues condicions

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

ACCTAT

>seq03

AAAACAGAG

En el camp de la bioinformàtica, el fitxer d’entrada està normalment estructurat amb un format taula, per defecte amb camps separats per espais o tabuladors (taules). Es mostren exemples amb l’ordre gawk de les possibilitats d’acció d’aquesta ordre.

Còpia en el teu terminal el fitxer mostrat a continuació i anomena’l 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

# Imprimeix la primera, la segona, la quarta i l’última columna del fitxer

$ 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 s’indica que el separador de camp de la sortida OFS sigui també un tabulador, l’estructura final de l’arxiu s’assemblarà al d’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

# Es realitza una recerca literal en aquest fitxer

$ 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

# Es realitza una recerca literal d’absència

$ 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 busques dominar gawk, és crucial que aprenguis a manejar correctament les variables NR, FS i OFS. Els exemples anteriors et donaran una comprensió profunda del seu comportament per defecte, així com de com manipular-les per modelar adequadament l’estructura dels registres de dades. Per tant, et recomanem que els estudiïs amb deteniment.