• Publicidad

Buscar palabras de un archivo en otro

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

Buscar palabras de un archivo en otro

Notapor wampaier » 2011-04-27 09:01 @417

¡¡Hola, qué tal!! Necesito que me ayuden a verificar cuál es mi error dentro de mi código... Éste, lo que hace es encontrar una palabra y buscar en otro archivo y me imprime cuántas veces aparece... Lo que pasa es que no me está contando como si no encontrara dicha palabra... Se los agradecería muchísimo... Este es el código que tengo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. open( my $fh, $ARGV[0] ) or die "No se puede abrir el archivo\n";
  7. print "Isogroup\tReads\n";
  8. my $var;
  9.  
  10. while (<$fh>) {
  11.     if ( $_ =~ /^(IGHV[0-9]{1,3}.*)\n/ ) {
  12.  
  13.         $var = $1;
  14.     }
  15.  
  16.     my $archivo = '/root/Desktop/2tca';
  17.     open( FH, $archivo ) or die "No se puede abrir\n";
  18.     my @result = grep {/$var/} <FH>;   #hago la busqueda de mi variable
  19.     print "$var\t";
  20.     print scalar @result . "\n";
  21.  
  22. }
  23.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Este es un ejemplo de mi archivo de entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
IGHV1-11*01
IGHV1-12*01
IGHV1-14*01
IGHV1-15*01
IGHV1-17-1*01
IGHV1-18*01
IGHV1-18*02
IGHV1-18*03
IGHV1-19*01
IGHV1-20*01
IGHV1-20*02
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y este es otro ejemplo del segundo archivo en el que busca:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. G07VVQL01AKZ6O  IGHV1-53*01     100.00  294     0       0       176     469     1       294     1e-168   583
  2. G07VVQL01AR4M7  IGHV3-6*01      97.60   292     5       2       141     430     5       296     6e-146   507
  3. G07VVQL01AKAR2  IGHV1-5*01      98.64   294     4       0       114     407     1       294     4e-159   551
  4. G07VVQL01AYVF0  IGHV1-74*01     95.59   295     10      3       135     429     1       292     4e-131   458
  5. G07VVQL01AY1S3  IGHV3-6*01      97.63   295     7       0       138     432     1       295     2e-152   529
  6. G07VVQL01AS9M4  IGHV1-42*01     100.00  294     0       0       140     433     1       294     1e-168   583
  7. G07VVQL01AUUUN  IGHV1-20*01     99.32   294     2       0       136     429     1       294     7e-164   567
  8. G07VVQL01APTS3  IGHV1-75*01     99.62   262     1       0       137     398     1       262     4e-147   511
  9. G07VVQL01A05KK  IGHV1-15*01     96.26   294     11      0       117     410     1       294     2e-142   496
  10. G07VVQL01A9HRQ  IGHV1-81*01     97.97   296     3       3       137     432     1       293     2e-148   515
  11. G07VVQL01AT7ZB  IGHV1-85*01     100.00  294     0       0       103     396     1       294     1e-168   583
  12. G07VVQL01AYVQW  IGHV1-39*01     99.66   294     1       0       137     430     1       294     3e-166   575
  13. G07VVQL01APOA8  IGHV1-18*01     99.66   295     0       1       140     434     1       294     2e-164   569
  14. G07VVQL01AS88E  IGHV1-71*01     98.01   301     6       0       140     440     1       301     2e-158   549
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


De verdad, agradecería mucho sus consejos... o ver en qué está fallando... por qué no realiza la instrucción...


¡¡¡¡¡¡¡¡Saludos!!!!!!!!
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Publicidad

Re: Buscar palabras de un archivo en otro

Notapor explorer » 2011-04-27 11:09 @506

El problema está en que las "palabras" del primer fichero contienen caracteres que son significativos para una expresión regular. En concreto, '*' es un operador que indica que queremos encontrar cero o más veces la expresión que le precede. Así, con /IGHV1-11*01/ no estás buscando por exáctamente 'IGHV1-11*01'. El asterisco tiene ahí un significado.

La solución sería "escapar" el significado de esos caracteres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $var = quotemeta($1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por otra parte, si las "palabras" son iguales a lo que estamos buscando en el segundo fichero, es mucho mejor usar otra cosa que no expresiones regulares. Con index() obtendrás un resultado mucho más rápido.

Otro detalle: si te fijas, estás abriendo y leyendo el segundo archivo por cada línea del primero. Eso no es eficiente. Si tienes suficiente memoria, es mejor almacenar toda la información en memoria y así el programa realizará el trabajo mucho más rápido.

Por otra parte, este problema lo hemos tratado en otras ocasiones:
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 8 invitados