• Publicidad

Contar palabras repetidas 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.

Contar palabras repetidas en un archivo

Notapor biovero88 » 2012-06-11 18:41 @820

¡Hola a todos!

Soy un poco nueva con Perl. El script que intento hacer debería contar cuántas veces está repetida una palabra, en una lista y al final imprimir la palabra y el número de veces que aparece.

Lo he intentado de mil formas y no he podido. Estaba revisando otros foros similares e intenté con las recomendaciones pero no me funciona. Por favor, ¡¡¡necesito ayuda!!! :?

¡¡Gracias!!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $hits = 'testb.txt';
  4.  
  5. #open file
  6. open( HITS, $hits );
  7.  
  8. #read sequences
  9. my @hits = <HITS>;
  10. close HITS;
  11.  
  12. for ( my $i = 0; $i < scalar @hits; ++$i ) {    #leer cada linea del archivo
  13.  
  14.     my @temp  = split( /\|/, $hits[$i] );       #determino a que corresponde cada campo en la linea actual
  15.     my $query = $temp[0];
  16.     my $exp   = $temp[1];
  17.     my $subj  = $temp[6];
  18.     my $count = 1;
  19.     %x = ( $query => $count );         #creo un array para el contador correspondiente a cada query
  20.  
  21.     my @temp2   = split( /\|/, $hits[ $i - 1 ] );    #determino a que corresponde cada campo en la linea anterior
  22.     my $p_query = $temp2[0];
  23.     my $p_exp   = $temp2[1];
  24.     my $p_subj  = $temp2[6];
  25.  
  26.     #verifico si el query de la linea actual es igual al de la linea anterior, si es así sumo 1 al contador
  27.     if ( $query eq $p_query ) {
  28.         $x{$count}++;
  29.     }
  30.     else {
  31.         $x{$count} = 1;                #si no, el contador continua en 1
  32.     }
  33. }
  34.  
  35. for my $query ( keys %x ) {            #ahora imprimo cada query con su contador
  36.     if ( $x{$count} > 0 ) {
  37.         print "$query\thits:$x{$count}\n";
  38.     }
  39. }
  40.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Adjuntos
testb.txt
este es el archivo de entrada
(4.16 KiB) 86 veces
biovero88
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-05-02 14:52 @661

Publicidad

Re: Contar palabras repetidas en un archivo

Notapor explorer » 2012-06-11 19:24 @850

Bienvenida a los foros de Perl en Español, biovero88.

Solo con el uso de los hash es suficiente como para llevar la cuenta de las apariciones de cada $query.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $hits = 'testb.txt';
  4. open( HITS, $hits );
  5. my @hits = <HITS>;
  6. close HITS;
  7.  
  8. my %x;                                          # contador de veces que aparece cada query
  9.  
  10. for ( my $i = 0; $i < scalar @hits; ++$i ) {    # leer cada línea del archivo
  11.  
  12.     my @temp  = split( /\|/, $hits[$i] );       # determino a qué corresponde cada campo en la línea actual
  13.     my $query = $temp[0];
  14.  
  15.     $x{ $query }++;                             # aumento en uno las veces que aparece $query
  16. }
  17.  
  18. for my $query ( keys %x ) {                     # ahora imprimo cada query con su contador
  19.     print "$query\thits:$x{$query}\n";
  20. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esta es otra versión, más corta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. open my $HITS, '<', 'testb.txt' or die;
  3. my @hits = <$HITS>;
  4. close $HITS;
  5.  
  6. my %veces;
  7.  
  8. for my $hit (@hits) {
  9.     my $query = (split /\|/, $hit)[0];          # la query es el primer campo de la línea $hit
  10.  
  11.     $veces{$query}++;                           # la query la contamos una vez más
  12. }
  13.  
  14. while (my($query, $veces) = each %veces) {
  15.     say $query, "\thits:", $veces;
  16. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De hecho, hasta se puede resolver en la misma línea de comandos, sin escribir ningún programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@portatil $ perl -F'\|' -anE '$v{$F[0]}++; END { say "$_\thits:$v{$_}" for keys %v }' testb.txt
  2. ArabidopsisthalianaToll-Interleukin-Resistancedomain-containingprotein(AT2G03030)mRNA,completecdsNM_126355.1    hits:5
  3. Arabidopsisthalianaproteinkinase-likeprotein(AT1G01450)mRNA,completecdsNM_100027.1      hits:19
  4.  
Coloreado en 0.002 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

Re: Contar palabras repetidas en un archivo

Notapor biovero88 » 2012-06-12 21:51 @952

¡¡¡Muchas gracias, explorer!!!

Me sirvieron muchísimo. Sin embargo, quisiera conocer bien el funcionamiento de los términos empleados en la línea de comandos, te agradecería mucho si me los pudieras explicar.
biovero88
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-05-02 14:52 @661

Re: Contar palabras repetidas en un archivo

Notapor explorer » 2012-06-13 04:06 @212

Opciones:
  • -F : define el separador de campos
  • -a : activar el modo de división de campos cuando -n o -p estén presentes
  • -n : hacer un bucle por las filas del archivo(s) de entrada, pero sin pintarlas
  • -E : ejecuta el siguiente programa descrito a continuación, activando además las nuevas características de Perl >v5.10
Y el programa hace:
  • por acción de -a, sabemos que en @F recibimos los campos, divididos por el delimitador indicado por -F, así que $F[0] contiene el primer campo de la línea
  • ese campo lo usamos como clave del hash %v, e incrementamos en uno la presencia de esa clave
  • cuando se terminen de leer todas las líneas, Perl ejecuta la subrutina especial END, que lo que hace es sacar a pantalla todas las claves del hash %v, junto con las veces que aparece cada clave
Finalmente, se indica el archivo a procesar.

Más información en tu propio ordenador en perldoc perlrun, y en la Web (traducido).
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

Re: Contar palabras repetidas en un archivo

Notapor biovero88 » 2012-06-15 10:36 @483

¡¡¡¡ Muchas gracias !!!! ¡¡¡otra vez!!! :D
biovero88
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-05-02 14:52 @661


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 9 invitados

cron