Página 1 de 1

Eliminar "padding" de archivo .SAM

NotaPublicado: 2012-03-08 06:16 @303
por danusol
Hola,

Tengo un archivo de alineamiento en formato SAM que tiene un encabezado y una sucesión de líneas con varios campos, os muestro un trozo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. @HD     VN:1.0  GO:none SO:coordinate
  2. @SQ     SN:APB LN:360
  3. @RG     ID:I245 SM:Sample_Mult_1
  4. @PG     ID:AA  PN:DataAnalyzer    VN:2.6
  5. @CO     Sequencing System.
  6. APB    0       APB    42      255     41H23M1P6M1P4M1P5M1P6M1P6M1P12M1P5M1P2M1P15M1P2M1P59M1P23M1P2M1P2M1P2M1P7  *       0       0       AGCTTAGCTTGGAAAGCCTCACCTCTTACTTTTCCATTGAGTCATCTACCAAAGGA  *       MD:Z:319        NM:i:0
  7. HEWCEEE01A0C7I  0       APOBex26_M13    42      255     41H23M1P6M1P4M1P5M1P6M1P6M1P12M1P5M1P2M1P15M1P2M1P59M1P23M1P2M1P2M1P2M1P7M1P  *       0       0       AGCTTAGCTTGGAAAGCCTCACCTCTTACTTTTCCATTGAGTCATCTACCAAAGGAGATGTCAAGGGTTCGGTTC  *       MD:Z:319        NM:i:0
  8. HEWCEEE01A2AQM  0       APOBex26_M13    42      255     41H23M1P6M1P4M1P5M1P6M1P6M1P12M1P5M1P2M1P15M1P  *       0       0       AGCTTAGCTTGGAAAGCCTCACCTCTTACTTTTCCATTGAGTCATCTACCAAAGGA  *       MD:Z:319        NM:i:0
  9.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El campo 6 conocido como CIGAR es una sucesión de números y letras. Las letras posibles son MIDNSHP, aunque en mi ejemplo no tengo todas. Este campo se distribuye por parejas de número/letra. por tanto, en la primera línea del ejemplo podemos leer algo así como 41H-23M-1P-6M-1P... etc.

La letra P significa que se ha hecho "padding" en el alineamiento.

Mi objetivo es eliminar la letra P y su correspondiente número en todas las líneas. En el ejemplo el número es siempre '1' pero puede ser cualquiera de uno o más de un dígito. He intentado hacer lo siguiente pero me deja el archivo igual:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! usr/bin/perl -w
  2. # use strict
  3.  
  4.  
  5. open (IN, $ARGV[0]) || die "File IN not found\n";
  6. my @salida= split /./, $ARGV[0];
  7. my $nombre= $salida[0] . "_unpad_" . $salida[1];
  8.  
  9. open OUT, ">", $nombre or die $!;
  10.  
  11. while (<IN>) {
  12.   chomp;
  13. my $pattern =~ '([MIDNSH])(\d+P)'; #texto a buscar. Quiero eliminar la segunda parte, por eso meto cada bloque entre paréntesis. No hace falta incluir P en la primera parte porque lee de izda. a dcha.
  14. foreach($_)
  15.   {
  16.       s/$2//g; #solo quiero que me elimine la P con su número
  17.  
  18. print OUT $_,"\n";
  19.   }
  20. }
  21. close (IN);
  22. close (OUT);
  23.  
  24.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


¿Alguien me puede ayudar?

Gracias

Re: Eliminar "padding" de archivo .SAM

NotaPublicado: 2012-03-08 07:22 @349
por explorer
Con este mini-programa lo puedes resolver desde la línea de comandos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -p -i.bak -E 'next if /^@/; s/\d+P//g' code_29985.txt
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo que hacemos es un bucle (-p) sobre el fichero indicado (code_29985.txt), leyéndolo por líneas, y ejecutando el programa (-E) en cada línea. Si la línea comienza por '@', no hacemos nada, y pasamos a la siguiente. Si no, hacemos la sustitución de toda combinación de \d+P por nada, a lo largo de toda la línea (/g). El fichero original es renombrado con .bak, y el resultado nuevo queda en el propio fichero (-i.bak).

Re: Eliminar "padding" de archivo .SAM

NotaPublicado: 2012-03-08 10:16 @469
por explorer
Acabo de darme cuenta de que hay un fallo en mi solución: está borrando cualquier aparición de un número seguido de una 'P', por lo que también borraría apariciones de esas combinaciones en otros lugares de la línea, como por ejemplo, en el primer campo.

Una solución rápida sería trabajar con columnas, filtrar la que nos interesa, y volver a recrear la línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -p -i.bak -a -E 'next if /^@/; $F[5] =~ s/\d+P//g; $_ = join("\t", @F) . "\n"' code_29985.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero perdemos los espacios originales y los sustituimos por un carácter tabulador.

No sé si esto te servirá. O si prefieres poner todo esto en forma de programa.

Re: Eliminar "padding" de archivo .SAM

NotaPublicado: 2012-03-09 04:50 @243
por danusol
Gracias Explorer. El tema de que la eliminación ocurra en cualquier otro campo además del de interés sí que es importante porque cambiaría posiblemente la primera columna que es el identificador de la secuencia. La verdad es que no tengo muy claro cómo se definen los espacios originalmente en este archivo. No es importante que todo sea un one-liner, sino que se puede meter en un pequeño programita.

D.


Editado: De hecho los separadores son tabuladores, así que, ¡perfecto!

Re: Eliminar "padding" de archivo .SAM

NotaPublicado: 2012-03-09 10:01 @459
por explorer
Bueno, la transformación de mini-programa a parte de un programa mayor, es fácil... ya ves que hay un bucle, que tiene un next(), y luego hay que hacer un split() en la línea, y que modificamos el campo número 5, y finalmente, rehacemos la línea con el join().