• Publicidad

Concatenar strings dentro de un loop

Perl aplicado a la bioinformática

Concatenar strings dentro de un loop

Notapor marioalbertocer » 2011-09-22 16:55 @747

Por favor, soy muy novato usando Perl. Solo llevo unas semanas aprendiendo, pero ahora tengo que desarrollar urgente un script que me permita hacer lo siguiente:

Tengo un archivo de texto plano que tiene la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> nombre de gen 1
TAGCGATCGATCGACGACTAGCATCAGCTG
CGATGCTGACTGATGCTGATCGATCGTACG
CGTAGCTGATCGTAGCTAGTCGTAGCTGAT
TATCGTAGCT
> nombre de gen 2
GCTGATCGTAGCTAGTCGTAGCTAGTCGAT
ACGTCGTAGCTAGTCGATGCTGATCGTAGT
AGCGATGCTAGTCGATGCTGATCGTAGCTG
TACTCGTGCGACGATGATCG
> nombre de gen 3
TCGATCGTAGCTGATCGTAGCTGATCGTAC
TAGCTGATCGTAGCTGTAGCTGATCGTAGG
ATCGTAGCTGATGCTGCTCGTGTGCATGAT
AGTTCGATCTTTGC
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y quiero ponerlo en esta forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> nombre de gen 1
TAGCGATCGATCGACGACTAGCATCAGCTGCGATGCTGACTGATGCTGATCGATCGTACGCGTAGCTGATCGTAGCTAGTCGTAGCTGATTATCGTAGCT

> nombre de gen 2
GCTGATCGTAGCTAGTCGTAGCTAGTCGATACGTCGTAGCTAGTCGATGCTGATCGTAGTAGCGATGCTAGTCGATGCTGATCGTAGCTGTACTCGTGCGACGATGATCG

> nombre de gen 3
TCGATCGTAGCTGATCGTAGCTGATCGTACTAGCTGATCGTAGCTGTAGCTGATCGTAGGATCGTAGCTGATGCTGCTCGTGTGCATGATAGTTCGATCTTTGC
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

(todo en una sola línea)

Esto es algo en lo que he estado pensando, pero no funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $name = 'Acaryochloris marina MBIC11017.ffn';
  4.  
  5. open(ARCHIVOADN, $name);
  6.  
  7. while ($secuencia = <ARCHIVOADN>) {
  8.  
  9.         do {
  10.  
  11.                 if ($secuencia =~ /^[ATCG]./) {        
  12.  
  13.                         $secuencia =~ s/\n//g;                 
  14.  
  15.                         $gene.= $secuencia;            
  16.  
  17.                 }
  18.  
  19.         } until ($secuencia =~ />/) {
  20.  
  21.                 print "next gene\n\n";
  22.  
  23.         }
  24.  
  25. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Por favor, su ayuda sería muy importante para mi.
marioalbertocer
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-09-22 16:47 @741

Publicidad

Re: Concatenar strings dentro de un loop

Notapor explorer » 2011-09-22 17:25 @767

Bienvenido a los foros de Perl en español, marioalbertocer.

Dentro del bucle do{}while() no estás leyendo nuevas líneas, por lo que podrías entrar en un bucle infinito.

Esta es mi versión, derivada de la tuya.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $name = 'Acaryochloris_marina_MBIC11017.ffn';
  4.  
  5. open(ARCHIVOADN, $name);
  6.  
  7. while ($secuencia = <ARCHIVOADN>) {
  8.     chomp $secuencia;                   # Quitamos el fin de línea
  9.  
  10.     if ($secuencia =~ /^>/) {           # Si es comienzo de secuencia...
  11.    
  12.         print "\n"                      # Terminamos la secuencia anterior
  13.             if $. > 1;                  # si no es la primera línea  
  14.  
  15.         print "$secuencia\n";           # Sacamos el nombre de la secuencia
  16.  
  17.         next;                           # Saltamos a la siguiente línea
  18.     }
  19.  
  20.     print $secuencia;                   # Si es parte de la secuencia, la sacamos tal cual
  21. }
  22.  
  23. print "\n";                             # Último avance de línea
  24.  
  25. close ARCHIVOADN;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Concatenar strings dentro de un loop

Notapor marioalbertocer » 2011-09-23 01:58 @123

Muchas gracias por tu respuesta, pero ahora tengo otro problema: quisiera saber si haciendo alguna variación al código que escribiste es posible tratar cada secuencia unificada por genes como una sola variable escalar. Es decir, que a partir de la línea 20 del código yo pueda tomar la variable $secuencia para realizar otro procedimiento con ella y ésta tome toda la secuencia unificada por genes y no cada secuencia por separado como en el archivo de entrada.

De antemano muchas gracias por tu ayuda.
marioalbertocer
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-09-22 16:47 @741

Re: Concatenar strings dentro de un loop

Notapor explorer » 2011-09-23 06:57 @331

Es que es mejor explicar lo que quieres hacer, desde el principio :)

Esto es un ejemplo de lo que se puede hacer:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. my $name = 'Acaryochloris_marina_MBIC11017.ffn';
  5.  
  6. open(ARCHIVOADN, $name);
  7.  
  8. my $gen;
  9.  
  10. while (my $secuencia = <ARCHIVOADN>) {
  11.     chomp $secuencia;                   # Quitamos el fin de línea
  12.  
  13.     if ($secuencia =~ /^>/) {           # Si es comienzo de secuencia...
  14.    
  15.         procesa_gen($gen)               # Procesamos el $gen
  16.             if $gen;                    # si realmente tenemos uno
  17.  
  18.         print "Procesando $secuencia\n";        # Sacamos el nombre de la secuencia
  19.  
  20.         $gen = '';                      # Inicializamos el gen
  21.  
  22.         next;                           # Saltamos a la siguiente línea
  23.     }
  24.  
  25.     $gen .= $secuencia;                 # Vamos concatenando la secuencia genética
  26. }
  27.  
  28. procesa_gen($gen)                       # Procesamos el último $gen
  29.     if $gen;                            # si realmente tenemos uno
  30.  
  31. print "\n";                             # Último avance de línea
  32.  
  33. close ARCHIVOADN;
  34.  
  35. sub procesa_gen {
  36.     my $gen = shift;
  37.  
  38.     print "[$gen]\n";
  39. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Concatenar strings dentro de un loop

Notapor marioalbertocer » 2011-09-23 22:43 @988

Muchas gracias. Hasta hace poco incorporé el código que escribiste a uno un poco más grande que tenía antes y logré lo que quería. Ahora solo me queda estudiar un poco lo que hiciste. Me ha sido muy útil.
marioalbertocer
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-09-22 16:47 @741


Volver a Bioinformática

¿Quién está conectado?

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

cron