1. Introducción a los entornos de trabajo UNIX

1.9. Acceder al contenido de los ficheros

1.9.1. Introducción

Un filtro, en el contexto de la línea de comandos de Gnu/Linux, es un programa que acepta datos textuales y los transforma de una manera particular. Los filtros son una forma de tomar datos en bruto, ya sea producidos por otro programa o almacenados en un archivo, y manipularlos para que se muestren de una manera más adecuada para encontrar lo que estamos buscando. Estos filtros a menudo tienen varias opciones de línea de comando que modificarán su comportamiento, por lo que siempre es bueno consultar la página del manual de un filtro para ver lo que está disponible.

En los ejemplos que se muestran a continuación, proporcionaremos entrada a estos comandos mediante un archivo, pero también veremos que podemos proporcionar entrada a través de otros medios que agregan mucha más potencia (tabla 6). Además, recuerda que el archivo se especifica como un path y, por lo tanto, puedes usar paths absolutos y relativos, y también comodines. Por otra parte, estas herramientas que estamos viendo solo sirven para trabajar con ficheros de texto, no binarios.

Tabla 6. Comandos para acceder al fichero.

Comando Descripción
cat Imprime un fichero en el terminal
more Muestra el resultado de la ejecución de un comando en el terminal de una página a la vez
head Es un comando que imprime las primeras diez líneas de su entrada, pero podemos modificar esto con un argumento de línea de comando
tail Es un comando que imprime las últimas diez líneas de su entrada, pero podemos modificar esto con un argumento de línea de comando
less Es un visor de ficheros de texto, con este comando no podremos editar el fichero, pero sí navegar por su contenido
nl number line significa ‘numerar líneas’, y eso es exactamente lo que hace
wc word count significa ‘contar palabras’ y hace precisamente eso (así como también cuenta caracteres y líneas). De forma predeterminada, dará un recuento de los tres, pero usando opciones de línea de comando podemos limitarlo a lo que necesitemos
diff Compara línea a línea dos ficheros de texto
paste Une ficheros tabulares línea por línea
od octal dump convierte la entrada en múltiples formatos, con formato octal por defecto, y ayuda a comprender los datos complejos que no son legibles para los humanos
sed stream editor Editor de flujo. Nos permite hacer una búsqueda y reemplazo, entre otras acciones, en nuestros datos

Fuente: elaboración propia.

En el campo de la bioinformática los archivos son muy grandes; incluso los editores en línea pueden tener problemas para abrirlos. Existen otras formas de acceder a los contenidos del fichero. Uno de ellos sería imprimir el fichero en el terminal utilizando el comando cat.

$cat hg38_RefSeq.txt

cat es, además, capaz de concatenar textos uno detrás de otro en el orden en que se los pasamos, y de mostrarlos en pantalla.

$ cat file1 file2 file3

O se puede generar un nuevo fichero.

$ cat seq1 seq2 >> set1-2.txt

Algunas opciones interesantes de cat son:

  • -A: muestra también los caracteres de control, básicamente los tabuladores (como ^I) y los retornos de carro ($).
  • -n: numera todas las líneas.

Para obtener una visión general del contenido del archivo sin ocupar todo el terminal, se pueden imprimir solo las primeras líneas usando el comando head:

$ head -3 hg38_RefSeq.txt
#bin name chrom strand    txStart    txEnd cdsStart   cdsEnd    exonCount exonStarts exonEnds   score name2     cdsStartStat    cdsEndStat exonFrames

0    NM_001276352.2  chr1 -    67092164   67134970   67093579 67127240    9      67092164,67096251,67103237,67111576,67115351,67125751,67127165,67131141,67134929,     67093604,67096321,67103382,67111644,67115464,67125909,67127257,67131227,67134970,    

0    C1orf141   cmpl cmpl 2,1,0,1,2,0,0,-1,-1, 0     NM_001276351.2  chr1 -    67092164   67134970     67093004   67127240   8    67092164,67095234,67096251,67115351,67125751,67127165,67131141,67134929,     67093604,67095421,67096321,67115464,67125909,67127257,67131227,67134970,   0    C1orf141   cmpl cmpl     0,2,1,2,0,0,-1,-1,

Existe el comando tail, y permite imprimir el final de los archivos.

$ tail -2 hg38_RefSeq.txt

Otro comportamiento de tail que resulta útil es que puede mostrar todas las líneas, excepto las k primeras líneas. Para ello hay que usar la opción -n y el número de líneas que queremos omitir precedido por un +. Si se quiere omitir las primeras veintidós líneas podemos escribir:

$ tail -n +22 hg38_RefSeq.txt

Cuando se necesita examinar un archivo de texto para familiarizarse con su contenido, es común abrirlo y navegar a través de él. Sin embargo, si el archivo es muy grande, puede haber problemas al intentar abrirlo con un editor de texto.

En estos casos, una herramienta útil es less, un visor de archivos de texto que puede manejar archivos inmensos sin problemas. Aunque less no permite la edición del archivo, sí nos permite navegar por su contenido de manera interactiva. Al ejecutar less, el programa se abrirá en el terminal y hará que el prompt desaparezca temporalmente. Podremos salir del programa en cualquier momento presionando la tecla q.

$ less hg38_RefSeq.txt

Dentro de less disponemos de varios comandos para movernos por el fichero:

  • Barra de espacio: página siguiente.
  • b: página anterior.
  • 100g: va a la línea 100 (o a la que le indiquemos).
  • -S: corta o no corta las líneas largas.
  • /palabra: busca la cadena de texto que le indiquemos (acepta expresiones regulares).
  • n: va a la siguiente palabra que coincide con la búsqueda.
  • N: va la palabra anterior que coincide con la búsqueda.
  • q: sale del fichero.
  • h: ayuda.

El comando wc significa conteo de palabras, y eso es lo que hace (así como contar caracteres y líneas). Por defecto, nos dará un recuento de las tres posibilidades, pero usando opciones de línea de comando, se puede limitar lo que se busca. A veces solo queremos uno de estos valores. Por ejemplo, «-l» nos dará solo las líneas, «-w» nos dará las palabras y «-m» nos dará los caracteres.

$ wc hg38_RefSeq.txt
172767  2764272 56256545 hg38_RefSeq.txt
$ wc -l hg38_RefSeq.txt
172767 hg38_RefSeq.txt

La segunda orden imprime por pantalla solo un recuento de líneas, pero la primera orden nos informa del número de líneas, palabras y caracteres que tiene el fichero.

El comando diff permite llevar a cabo la comparación línea a línea de dos ficheros de texto. Obviamente, hay formas más sofisticadas de comparar archivos. Sin embargo, esta función es extremadamente útil para confirmar cuando dos ficheros no son idénticos (una de las operaciones más comunes en bioinformática).

$ diff file1.txt file2.txt

Por último, se comenta el comando paste. Supongamos que tenemos dos ficheros, uno con datos sobre la progresión de la enfermedad de una serie de enfermos y otro con el genotipado de los mismos:

$ cat pacientes.txt
id_paciente,nivel_glucosa

1,190

2,250

3,220

4,260

5,160

$ cat genotipado.txt
id_paciente,SNP_a,SNP_b
1,AA,CC
2,AC,GG
3,AA,CG
4,AT,GG
5,AA,CC

Se pueden fusionar los dos archivos usando el comando paste línea a línea:

$ paste -d',' pacientes.txt genotipado.txt
id_paciente,nivel_colesterol,id_paciente,SNP_a,SNP_b

1,190,1,AA,CC

2,250,2,AC,GG

3,220,3,AA,CG

4,260,4,AT,GG

5,160,5,AA,CC

La cantidad de información almacenada en cualquier entorno bioinformático es considerable, y a menudo ocupa varios terabytes. Por ejemplo, la secuencia del genoma humano está compuesta por alrededor de tres mil millones de nucleótidos, lo que se traduce en aproximadamente tres gigabytes. Esto implica que a menudo es necesario comprimir directorios enteros, la instrucción tar puede crear un paquete único a partir del directorio, que posteriormente puede ser comprimido con gzip. La tabla 7 describe los comandos para comprimir/descomprimir más habituales:

Tabla 7. Comandos para acceder a los ficheros.

Comando Descripción
tar Empaquetar múltiples archivos y directorios
gzip Comprimir y descomprimir archivos
zmore Descomprimir y visualizar un archivo
zcat Descomprimir y volcar un archivo

Fuente: elaboración propia.

En el ejemplo anterior de tar, las opciones indican que se crea (c) un archivo (f) llamado backup.tar que incluye todos los contenidos del directorio /home/student y sus subdirectorios, y que se muestren mensajes detallados mientras se crea la copia de seguridad (v). Debido a que backup.tar es un argumento de la opción f, backup.tar debe seguir inmediatamente a la opción. Otras opciones son:

$ tar -xvf backup.tar

# La nueva opción (x) indica que se desempaquete el fichero backup.

$ tar -czvf backup.tar.gz /home/student

# La opción (z) indica que después de que se cree el fichero se comprima.

$ tar -xzvf backup.tar.gz

Esta combinación de opciones indica que el fichero se descomprima y se desempaquete.

Los comandos more y cat poseen una versión especial que integra el comando gzip como un filtro adicional. Como resultado, podemos visualizar directamente en el terminal un fichero comprimido:

$ gzip NANOGgene.fa
$ zmore NANOGgene.fa.gz | head -5
>hg19_refGene_NM_024865 range=chr12:7941992-7948657
TTCATTATAAATCTAGAGACTCCAGGATTTTAACGTTCTGCTGGACTGAG
CTGGTTGCCTCATGTTATTATGCAGGCAACTCACTTTATCCCAATTTCTT
GATACTTTTCCTTCTGGAGGTCCTATTTCTCTAACATCTTCCAGAAAAGT
CTTAAAGCTGCCTTAACCTTTTTTCCAGTCCACCTCTTAAATTTTTTCCT
$ zcat NANOGgene.fa.gz | tail -3
GTTGGTTTAAGTTCAAATGAATGAAACAACTATTTTTCCTTTAGTTGATT
TTACCCTGATTTCACCGAGTGTTTCAATGAGTAAATATACAGCTTAAACA
TAA
$ gzip -d NANOGgene.fa.gz