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 |
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
.
Recuerda que con Crtl + C los programas se terminan inmediatamente y se vuelve a mostrar el prompt (en castellano, la línea de comandos).
$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 |
Un ejemplo con tar
:
$ tar -cvf backup.tar
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