• Publicidad

Búsqueda en un archivo

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Búsqueda en un archivo

Notapor biovero88 » 2012-08-01 09:58 @457

Buenos días.

Me encuentro en un dilema con este script. Lo que necesito es que busque en cada línea del archivo blastx_l.txt, cada código de la lista Col_cod.txt y muestre la línea del archivo blastx_l.txt en la que encontró el código.

El problema es que me sigue imprimiendo todas las líneas del archivo blastx_l.txt, y no sé por qué :?

¡¡¡Ayúdenme, por favor!!!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # usr/bin/perl -w
  2.  
  3. $lista_cod = "Col_cod.txt";
  4. open( LISTACOD, $lista_cod );
  5. @lista_cod = <LISTACOD>;
  6. close LISTACOD;
  7.  
  8. $Rblast = "blastx_l.txt";
  9. open( RBLAST, $Rblast );
  10. @Rblast = <RBLAST>;
  11. close RBLAST;
  12.  
  13. open my $salida, '>', 'list1_col.txt';
  14.  
  15. @salida = "";
  16. for ( $i = 0; $i < scalar @Rblast; ++$i ) {
  17.     $ok  = "";
  18.     @R   = split( /\t/, $Rblast[$i] );
  19.     $cod = $R[4];
  20.     foreach $linea (@lista_cod) {
  21.  
  22.         #print $linea;
  23.         unless ( $cod != $linea ) {
  24.             $ok = $Rblast[$i];
  25.  
  26.             #print $Rblast[$i];
  27.             #print $linea;
  28.         }
  29.  
  30.     }
  31.     print $ok;
  32. }
  33.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Sintáxis: (Col_cod.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
CAA92325.1
BAE44439.1
ABG49144.1
CBD29743.1
CBD24802.1
ADW66126.1
AAD46412.1

ACH56716.1
AAA33811.1
CAC84561.1
AAW23965.1
ABA46764.1
ABB16993.1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: (blastx_l.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Contig10        gi      74273683        gb      AAA13372.2
Contig13        gi      255762735       gb      ACU33178.1
Contig20        gi      7430935 pir     S72477
Contig21        gi      89241656        emb     CAJ32378.1
Contig46        gi      158342648       gb      ABW34945.1
Contig53        gi      114432126       gb      ABI74671.1
Contig56        gi      219742364       emb     CAW34879.1
Contig60        gi      89241712        emb     CAJ32435.1
Contig66        gi      60496105        emb     CAI61671.1
Contig88        gi      118490015       gb      ABK96801.1
Contig92        gi      89474464        gb      ABD72959.1
Contig93        gi      110083943       gb      ABG49144.1
Contig104       gi      13111661        gb      AAG45487.1
Contig113       gi      30422751        emb     CAD90243.1
Contig114       gi      219753963       emb     CAW35676.1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-08-01 12:10 @549, editado 3 veces en total
Razón: Formateado de código con Perltidy
biovero88
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-05-02 14:52 @661

Publicidad

Re: Búsqueda en un archivo

Notapor explorer » 2012-08-01 12:43 @571

El problema está en la comparación de la línea 23.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         unless ( $cod != $linea ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Cuánto vale $cod? Pues es el quinto campo de cada línea de blastx_l.txt. Una cadena de caracteres.
¿Cuánto vale $linea? Es cada una de las líneas de Col_cod.txt. Una cadena de caracteres, terminada con caracteres de avance de línea.

Y ya vemos el problema. Mejor dicho, los dos problemas.
  1. Estás usando el operando de comparación numérica '!=', y los operandos no son números, sino cadenas de caracteres.
  2. $linea tiene uno o dos caracteres extra, al final, que no deseas utilizar en la comparación: los caracteres de fin de línea (avance de línea y/o retorno de carro).

Las soluciones son:
* Quitar los caracteres de avance de línea leídos desde Col_cod.txt:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. chomp @lista_cod;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* Hacer que la comparación sea alfanumérica:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         unless ( $cod ne $linea ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Mejor así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         if ( $cod eq $linea ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y así queda más claro (¿Es $cod igual a $linea?)

Otra forma de resolverlo, más rápido, es hacer que los códigos sean claves de un hash. Así nos ahorramos un bucle interior:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use autodie;
  3.  
  4. ## Leemos los códigos y los pasamos a un hash
  5. my %codigos;
  6. open my $CODIGOS, '<', 'Col_cod.txt';
  7. while (my $cod = <$CODIGOS>) {
  8.     chomp $cod;                                 # quitamos caracteres de fin de línea
  9.     $codigos{$cod} = 1;                         # lo almacenamos como clave de un hash
  10. }
  11. close $CODIGOS;
  12.  
  13. ## Leemos los registros BLAST
  14. open my $FILE_BLAST, '<', 'blastx_l.txt';
  15. while (my $blast = <$FILE_BLAST>) {             # para cada registro BLAST
  16.     my($cod) = (split " ", $blast)[4];          # quinto campo del registro
  17.  
  18.     if (exists $codigos{$cod}) {                # ¿ese código existe en nuestra lista de códigos?
  19.         print $blast;                           # sí, sacamos todo el registro en pantalla
  20.     }
  21. }
  22. close $FILE_BLAST;
  23.  
  24. __END__
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron