parent nodes: FicherosTexto | UnixLinuxCygwinApuntes

FicherosTexto

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:

grep

wc

    $ grep -i leukemia microarray_adenoma_hk691.csv | wc
     93    5482   32942

cut

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

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

$ 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

$ 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

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