• Publicidad

Ayuda buscar en y lista de resultado

Perl aplicado a la bioinformática

Ayuda buscar en y lista de resultado

Notapor pubafra » 2016-06-24 09:49 @451

Hola, grupo. Solicito de su ayuda para resolver un problema. Espero explicar bien el problema para que puedan ayudar a la solución.

Resulta que tengo la siguiente lista de genes abreviados:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ACY1
RNA5S1
USP12-AS1
TRAJ23
ZFAT
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y deseo buscar cada uno en el siguiente archivo de nombres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Approved Symbol Approved Name
A2MP1   alpha-2-macroglobulin pseudogene 1
ACY1    aminoacylase 1
SLIT2   slit guidance ligand 2
RN7SL843P       RNA, 7SL, cytoplasmic 843, pseudogene
SP9YP24 ubiquitin specific peptidase 9, Y-linked pseudogene 24
USP12-AS1       USP12 antisense RNA 1
ZFAT    zinc finger and AT-hook domain containing
ZIC5    Zic family member 5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El resultado que necesito es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ACY1    aminoacylase 1
RNA5S1  -
USP12-AS1       USP12 antisense RNA 1
TRAJ23  -
ZFAT    zinc finger and AT-hook domain containing
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como se observa, RNA5S1 y TRAJ23 no se encuentran en el archivo de nombres por lo cual su resultado es "-".

Presento el script que escribí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use warnings;
  2.  
  3. open (ABREFILE, "Abrevlist.txt"); #Abre la lista de abreviaturas
  4. while (<ABREFILE>){     #Lee cada línea
  5.         chomp;
  6.         $abrev = $_;
  7.         ind_sec();      #Envia la primer línea (abreviatura) a la subrutina
  8.         }
  9.  
  10. sub ind_sec{
  11. open (NOMBREFILE2, "NombreFile.txt");   #Abre el archivo con nombres
  12.         while ($line = <NOMBREFILE2>){
  13.                         if ($line =~ m/^$abrev\s/g){    #Buscar la abreviatura en la cada línea del archivo con nombres
  14.                                 print "$line";  #si la sentencia se cumple imprime la línea
  15.                         }                                       #
  16.                         else{   #si la abreviatura no se encuentra
  17.                                 print "\t-"; # quiero que imprima la abreviatura con - por delante
  18.                         }
  19.                
  20.         }
  21. }
  22. close(ABREFILE);
  23. close(NOMBREFILE2);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El resultado que consigo es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ACY1    aminoacylase 1
USP12-AS1       USP12 antisense RNA 1
ZFAT    zinc finger and AT-hook domain containing
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

el cual no incluye RNA5S1 y TRAJ23. Además el problema se complica cuando la lista de abreviaturas es más grande al igual que el archivo de nombres.

Mi principal dolor de cabeza es en la sentencia else{} porque me da respuesta para cada una de las líneas del archivo de nombres y solo quiero que responda solo una vez para todas esas líneas con un simple "-".

Espero contar con su apoyo. Saludos.
pubafra
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2014-12-04 21:16 @927

Publicidad

Re: Ayuda buscar en y lista de resultado

Notapor explorer » 2016-06-24 15:54 @704

El error está en que vuelves a leer todo el archivo de definiciones por cada abreviatura a procesar, o sea, lees NxM líneas, cuando, realmente, este problema solo es necesario procesar N+M líneas. En archivos pequeños no se nota, pero mucho cuando empiezan a crecer.

Entonces, lo que se suele hacer en estos casos, es leer en memoria uno de los archivos (normalmente a un hash) y luego recorrer todas las líneas del segundo, grabando al mismo tiempo el resultado.

En este caso, es claro que tenemos que leer el archivo de definiciones, y luego vamos procesando por cada línea de el de las abreviaturas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.20;
  3. use utf8;
  4. use autodie;
  5.  
  6. # leemos el archivo de definiciones de abreviaturas
  7. my %definiciones;
  8. open my $DEFINICIONES, '<', 'NombreFile.txt';
  9. while (my $def = <$DEFINICIONES>) {
  10.     chomp $def;
  11.  
  12.     my($abreviatura, $definición) = split " ", $def, 2;                # suponemos que son dos columnas separadas por espacios
  13.  
  14.     $definiciones{$abreviatura} = $definición;                 # guardamos la $definición de la $abreviatura, en %definiciones
  15. }
  16. close $DEFINICIONES;
  17.  
  18. #use Data::Dumper;
  19. #say Dumper \%definiciones;
  20.  
  21. # Procesamos todas las líneas de abreviaturas
  22. open my $ABREVIATURAS, '<', 'Abrevlist.txt';
  23. while (my $abbr = <$ABREVIATURAS>) {
  24.     chomp $abbr;
  25.     print "$abbr\t";
  26.     if (exists $definiciones{$abbr}) {
  27.         print $definiciones{$abbr};
  28.     }
  29.     else {
  30.         print '-';
  31.     }
  32.     print "\n";
  33. }
  34. close $ABREVIATURAS;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Este problema, el de buscar una información de un archivo en las líneas de otro, es un tema frecuente. Bueno, quiero decir que se ha tratado varias veces. Por ejemplo, Extracción de líneas coincidentes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
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 2 invitados

cron