parent nodes: FicherosTexto | UnixLinuxCygwinApuntes
Src: http://bioinf.comav.upv.es/courses/linux/unix/procesamiento_texto.html
Imprimiendo ficheros cat, head y tail
Archivo para probar: microarray_adenoma_hk91.csv
Es un archivo muy muy grande, si lo mostramos con cat bloqueará la terminal durante batante tiempo.
$ cat microarray_adenoma_hk69.csv
Para hacernos una idea del contenido del fichero sin bloquear la terminal podemos imprimir tan solo las primeras líneas utilizando el comando head:~$ head microarray_adenoma_hk69.csv
"!Exptid=10029"
"!Experiment Name=Adenoma (HK69)"
"!Organism=Homo sapiens"
"!Category=Adenoma"
"!Subcategory=Liver"
"!Experimenter=Xin Chen"
"!Contact email=chenx@pharmacy.ucsf.edu"
"!Contact Address1=Dept. of Biopharmaceutical Sciences"
"!Contact Address2=513 Parnassus Ave. S-816"
"!Contact Address3=Box 0446"
Usar tail para imprimir el final de los archivos:~$ tail microarray_adenoma_hk69.csv
24183 "EMPTY" "EMPTY" 19 27 32 0
Tanto a head como a tail podemos pedirles que impriman el número de líneas que nosotros deseemos: -n num
~$ head -n 2 microarray_adenoma_hk69.csv
"!Exptid=10029"
"!Experiment Name=Adenoma (HK69)"
Navegando por un fichero de texto
Abrir con un editor básico un archivo tan grande puede dar problemas
less nos permite abrir grandes archivos pero sólo para verlos (read only)
~$ less microarray_adenoma_hk69.csv
Dentro de less disponemos de varios comandos para movernos por el fichero:
barra espaciadora: página siguiente.
b: página anterior.
100n: va a la línea 100 (o 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 programa
grep
wc
Contador de líneas, palabras (word count) y caracteres
Unido con grep podemos contar cuantos genes hay relacionados con la leucemia:
$ grep -i leukemia microarray_adenoma_hk691.csv | wc
93 5482 32942
El primer número es el número de líneas.
Hay 93 genes de leucemia en el fichero.
cut
Para ficheros de texto divididos en campos (csv)
Corta el resultado de un grep (p.ej) para que sólo muestre campos determinados
head obtiene las primeras 40 líneas
la tubería (pipe) se las pasa a grep
grep busca en esas líneas la palabra leukemia
$ head -n 40 microarray_adenoma_hk691.csv | grep -i -n leukemia
23:3 "IMAGE:302190" "MLL" "Myeloid/lymphoid or mixed-lineage leukemia (trithorax homolog, Drosophila)" "Hs.258855" "N77807" 4297 13770 "CDNA" 3 1 1 0 14918 "A" 9 "GF200:96(1A5):384(1A9)" "Y" "U" 500005 100 96 51 81 88 44 56 413 357 83 336 253 62 254 192 59 7375 86 4097 1411 1859 "-.895" 220 32 261809 ".709" ".718" ".538" ".93" ".641" 113006 0
39:19 "IMAGE:810743" "MLF2" "Myeloid leukemia factor 2" "Hs.524214" "AA457726" "MLF2=myelodysplasia/myeloid leukemia factor 2" 8079 14593"CDNA" 19 1 1 0 14919 "I" 1 "GF200:96(5E1):384(2I1)" "Y" "U" 500433 100 100 52 319 328 43 57 2679 2622 108 6428 6320 81 4869 4788 59 47 114 60111 ".415" ".548" ".869" 372 52 3543182 01/02/41 2377 1826 ".98" 2449 110866 0
El resultado es muy lioso, si sólo nos interesa el nombre y la descripción del gen, podemos simplificarlo:
$ head -n 40 microarray_adenoma_hk691.csv | grep -i -n leukemia | cut -f 1,3,4
23:3 "MLL" "Myeloid/lymphoid or mixed-lineage leukemia (trithorax homolog, Drosophila)"
39:19 "MLF2" "Myeloid leukemia factor 2"
-f indica el número de campo(empieza en 1) (pongo el 1 para que salga también el número de línea (23 y 39)
-d; si el separador es el ;
-d, si el separador es la ,
(por defecto si no se pone -d usa el tabulador)
sed
Toma las líneas una a una y aplica transformaciones.
Por ejemplo evitar que salgan las comillas en el último resultado.
O hacer que el número de línea salga bien (23 y 39) en vez de 23:3 y 39:19
La sintaxis de sed puede parecer un poco obscura pero se aprende practicando
s --> substituir
s/patrón_a_substituir/nuevo_patrón/
s/\"//g --> \" son las comillas escapadas --> // indica "" --> g indica todas las que aparezcan
Por lo tanto: s/\"//g substituye todas las comillas de la línea por nada (las borra)
$ head -n 40 microarray_adenoma_hk691.csv | grep -i -n leukemia | cut -f 1,3,4 | sed s/\"//g
23:3 MLL Myeloid/lymphoid or mixed-lineage leukemia (trithorax homolog, Drosophila)
39:19 MLF2 Myeloid leukemia factor 2
Acepta expresiones regulares como patrones.
Además de la s (substituir) también podemos usar otros comandos como d (borrar).
Para más información ver:
man sed
Supongo que habrá una forma mejor que el llamar dos veces a sed, pero esta la he hecho yo, sin mucho dominio de regexp y con esto he conseguido dejar el número de línea sin los dos puntos y el otro número:$ head -n 40 microarray_adenoma_hk691.csv | grep -i -n leukemia | cut -f 1,3,4 | sed s/\"//g | sed s/\:[0-9]*//
23 MLL Myeloid/lymphoid or mixed-lineage leukemia (trithorax homolog, Drosophila)
39 MLF2 Myeloid leukemia factor 2
sort
Ordenar, tanto alfabéticamente como numéricamente (ver el manual)
$ head -n 1000 microarray_adenoma_hk691.csv | grep -i leukemia | cut -f 3,4 | sed s/\"//g | sort
EGFR Epidermal growth factor receptor (erythroblastic leukemia viral (v-erb-b) oncogene homolog, avian)
ERBB2 V-erb-b2 erythroblastic leukemia viral oncogene homolog 2, neuro/glioblastoma derived oncogene homolog (avian)
MCL1 Myeloid cell leukemia sequence 1 (BCL2-related)
MLF1 Myeloid leukemia factor 1
MLF2 Myeloid leukemia factor 2
MLL Myeloid/lymphoid or mixed-lineage leukemia (trithorax homolog, Drosophila)
PBX2 Pre-B-cell leukemia homeobox 2
RAF1 V-raf-1 murine leukemia viral oncogene homolog 1
TCL6 T-cell leukemia/lymphoma 6
THRA Thyroid hormone receptor, alpha (erythroblastic leukemia viral (v-erb-a) oncogene homolog, avian)
THRA Thyroid hormone receptor, alpha (erythroblastic leukemia viral (v-erb-a) oncogene homolog, avian)
uniq
Hay genes repetidos,
uniq elimina líneas repetidas consecutivas
para que funcione hay que ordenar antes
$ head -n 1000 microarray_adenoma_hk691.csv | grep -i leukemia | cut -f 3,4 | sed s/\"//g | sort | uniq
EGFR Epidermal growth factor receptor (erythroblastic leukemia viral (v-erb-b) oncogene homolog, avian)
ERBB2 V-erb-b2 erythroblastic leukemia viral oncogene homolog 2, neuro/glioblastoma derived oncogene homolog (avian)
MCL1 Myeloid cell leukemia sequence 1 (BCL2-related)
MLF1 Myeloid leukemia factor 1
MLF2 Myeloid leukemia factor 2
MLL Myeloid/lymphoid or mixed-lineage leukemia (trithorax homolog, Drosophila)
PBX2 Pre-B-cell leukemia homeobox 2
RAF1 V-raf-1 murine leukemia viral oncogene homolog 1
TCL6 T-cell leukemia/lymphoma 6
THRA Thyroid hormone receptor, alpha (erythroblastic leukemia viral (v-erb-a) oncogene homolog, avian)
paste
paste une ficheros tabulares (csv) línea por línea
pacientes.txt:id_paciente,nivel_colesterol
1,190
2,250
3,220
4,260
5,160
genotipado.txt:id_paciente,SNP_a,SNP_b
1,AA,CC
2,AC,GG
3,AA,CG
4,AT,GG
5,AA,CC
Unidos en un mismo fichero:$ 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
Para guardarlo en un nuevo archivo hay que redireccionar la salida,
Ojo que es línea a línea, no comprueba que el id_paciente sea el mismo.
Hay que ordenar antes los dos ficheros usando el mismo criterio, y aun así, puede fallar.
join
Une dos archivos tabulares (csv) usando un campo común
Es como paste pero mejorado
$ join pacientes.txt genotipado.txt
id_paciente,nivel_colesterol,SNP_a,SNP_b
1,190,AA,CC
2,250,AC,GG
3,220,AA,CG
4,260,AT,GG
5,160,AA,CC
codificación de caracteres
$ cat texto.txt
¡Buenos dÃas! ¿PodrÃa hacerlo también? ¡Muchas gracias!
$ cat texto.txt | iconv -f utf8 -t latin1
¡Buenos días! ¿Podría hacerlo también? ¡Muchas gracias!
Fin de línea
EJERCICIOS
Más información en http://www.emezeta.com/articulos/10-comandos-para-trabajar-en-linux#ixzz2JYWYse88