• Publicidad

Sustitución de la palabra "5'" en un oneliner

Perl aplicado a la bioinformática

Sustitución de la palabra "5'" en un oneliner

Notapor PERLita » 2011-02-15 23:45 @031

¡Hola! Soy nueva con el uso del Perl y la programación en general y estoy tratando de hacer un oneliner para realizar la edición de la primera línea de un archivo FASTA (fastaheader) del Genebank, y básicamente lo he hecho a base de la expresión regular:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -pe 'if(/^>/){ s/gi\|//; s/\|.*\| / /;s/bv.//; s/strain//;s/gene,//;s/partial//;s/cds//;s/.//g;s/-//g;s/    / /g;s/   /  /g;s/  / /g;s/ /_/g} s/^\n$//' archivo.fasta | grep '>'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Con el grep() voy viendo cómo va quedando y le voy metiendo más s/// según lo que quiero quitar.

Un ejemplo de fastaheader sería:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>gi|48922|emb|X59956.1| R.leguminosarum recA gene and alaS gene 5'end for the RecA protein and alanyl-tRNA synthetase, respectively
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y yo lo que quiero es que quede

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>48922_R_leguminosarum_recA_alaS_alatRNA
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ya logré que quedara casi como quiero. El problema es que no puedo quitar la parte que dice 5' y es que me imagino que se confunde con las comillas de la expresión, intenté s/5\'// y s/5*// y en los dos casos me marcó error.

¿Alguien tiene una sugerencia para poder quitar la comilla?

O ya encarrerada, ¿alguien sabe o tiene un script para poder realizar la edición de los fastaheaders?

¡¡¡Muchas muchas gracias!!!
PERLita
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-02-15 23:24 @017

Publicidad

Re: Sustitución de la palabra "5'" en un oneliner

Notapor explorer » 2011-02-16 03:46 @199

Bienvenido a los foros de Perl en Español, PERLita.

Pero, ¿cuál es la regla de formación del nombre final. Yo lo veo complicado... ¿cómo se forma la parte "alatRNA"?

En cuanto a las expresiones regulares, la de s/.//g elimina toda la cadena. Querrás decir esto: s/[.]//g.

Una opción, quizás más cómoda, es ver que la línea tiene delimitadores (los '|'), así que podemos usar split() para extraer los distintos campos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $_ = '>gi|48922|emb|X59956.1| R.leguminosarum recA gene and alaS gene 5\'end for the RecA protein and alanyl-tRNA synthetase, respectively';
  4.  
  5. print "$_\n";
  6.  
  7. @campos = split /\|/;
  8.  
  9. if (/^>/) {
  10.     $nombre = $campos[-1];
  11.    
  12.     for ($nombre) {
  13.    
  14.         s/^ +//;        # quitamos los espacios al principio
  15.         s/ +$//;        # y al final
  16.    
  17.         s/,? ?(gene|partial|strain|cds|respectively)//g;        # quitamos partículas no significativas    
  18.  
  19.         s/(?: and)? alaS.+?(?:and|$)/ alaS/;                    # simplificamos secciones
  20.         s/(?: and)? alanyl-tRNA.+?(?:and|$)/ alatRNA/g;
  21.  
  22.         s/[ .]/_/g;     # transformación
  23.     }
  24. }
  25.  
  26. print ">$campos[1]_$nombre\n";
  27.  
  28. print ">48922_R_leguminosarum_recA_alaS_alatRNA\n";
  29.  
  30. __END__
  31. >48922_R_leguminosarum_recA_alaS_alatRNA
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La línea 7 del código parte la línea por los delimitadores '|'. Esto solo nos vale si sabemos que todas las líneas tienen los campos que nos interesan: el segundo y el último.

Extraemos el campo final como el $nombre de la secuencia.

El bucle for() aplica las expresiones regulares a la variable $nombre.

Primero le quitamos los espacios que tenga por delante y por detrás.

Luego quitamos partículas (palabras precedidas por espacios y comas) que no nos interesan.

Y luego viene la parte más elaborada: buscamos secciones, que consisten en las cadenas alaS y alanyl-tRNA, posiblemente precedidas por el ' and', y seguidas por otro 'and' o el final de línea. Todo eso es transformada en una cadena más corta (alaS y alatRNA).

Esta también es la parte más controvertida, porque no está claro cómo se debe hacer esa reducción en todos los casos. Si hubiera una o más reglas que lo definan, pues se podrían poner.

Finalmente, cambiamos los espacios y puntos por el guión bajo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sustitución de la palabra "5'" en un oneliner

Notapor PERLita » 2011-02-17 10:16 @469

Muchas gracias. Sí, quedó muy bien, ¡je,je! Perdón por lo del s/.//g, se me olvidó ponerle s/\.//g.

Tengo otra pregunta, si todos mis fastas están en un archivo (secuencias.fna) y quisiera aplicar el script (para generar secuencias.fnaed), ¿cómo le hago?

La estructura general de un fastaheader de una secuencia del GeneBank es la siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>gi|255989414|gb|GQ323695.1| Rhizobium leguminosarum bv. viciae strain Nvf4 putative recombinase (recA) gene, partial cds
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


o

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>gi|clavennumérica|sigla2ó3letras|claveletrasconpunto|Nombre1 nombre2 pns nombre3 pns nombre4 pns pns pns pns pns pns
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Nota:
* pns = partícula no significativa
* el nombre 3 o 4 pueden o no estar

Y cómo quiero que quede es

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>255989414_Rhizobium_leguminosarum_viciae_Nvf4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


o

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>clavenumérica_Nombre1_nombre2_nombre3_nombre4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



¡Muchas gracias por la ayuda anterior! Ojalá se pueda otra vez.


PERLita
PERLita
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-02-15 23:24 @017

Re: Sustitución de la palabra "5'" en un oneliner

Notapor explorer » 2011-02-17 14:42 @654

Me temo que no has acertado con el patrón...

Esta solución sigue fielmente el patrón indicado de cómo se ha de reducir la entrada, pero no obtenemos lo que queremos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3.  
  4. my $entrada = '>gi|48922|emb|X59956.1| R.leguminosarum recA gene and alaS gene 5\'end for the RecA protein and alanyl-tRNA synthetase, respectively';
  5.  
  6. print "$entrada\n";
  7.  
  8. # partición por los delimitadores principales
  9. #>gi|clavennumérica|sigla2ó3letras|claveletrasconpunto|Nombre1 nombre2 pns nombre3 pns nombre4 pns pns pns pns pns pns
  10. my (undef, $clave_numérica, $nombre) = (split /\|/, $entrada, 5)[0,1,4];
  11.  
  12. # partición del nombre, usando los espacios en blanco como delimitadores
  13. #                              Nombre1    nombre2     pns     nombre3     pns    nombre4 pns pns pns pns pns pns
  14. my (@nombres) = $nombre =~ /\s* (\S+)  \s+ (\S+)  \s+ \S+ \s+  (\S+)  \s+ \S+ \s+ (\S+) /x;
  15.  
  16. # transformación
  17. for (@nombres) {
  18.     s/[ .]/_/g;
  19. }
  20.  
  21.  
  22. # salida
  23. #>clavenumérica_Nombre1_nombre2_nombre3_nombre4
  24. say join q[_], ">$clave_numérica", @nombres;
  25.  
  26. __END__
  27. >gi|48922|emb|X59956.1| R.leguminosarum recA gene and alaS gene 5'end for the RecA protein and alanyl-tRNA synthetase, respectively
  28. >48922_R_leguminosarum_recA_and_gene
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De hecho, es peor que mi primera solución.

Hasta que no des con la clave de cómo reducirlo...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron