• Publicidad

Comparar palabras entre columnas

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

Comparar palabras entre columnas

Notapor DrGuero » 2015-05-06 04:35 @233

Hola, buenos días.

Quiero hacer un pequeño script que me permita leer una primera columna de palabras y que compare cada palabra de la primera columna con las palabras de la segunda columna. Solo si las palabras son iguales quiero que el programa me imprima las columnas ordenadas.

Ejemplo: (file1.txt)
a b
b c
c a
j z

Ejemplo (resultado final)
a a
b b
c c

Con mi programa no consigo el resultado esperado y por el momento no encuentro el error.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. open( file, "file1.txt" ) or die("error");
  3. my $nom2;
  4. while (<file>) {
  5.     my @list = split( /\t/, $_ );
  6.     my $nom1 = $list[0];
  7.     my $nom2 = $list[1];
  8.     if ( $nom1 eq $nom2 ) {
  9.  
  10.         print("$nom1\t$nom2\n")
  11.  
  12.     }
  13.  
  14. }
  15. close(file) or die("I cannot close the file");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4




Agradezco cualquier consejo o ayuda. ¡Muchísimas gracias!
DrGuero
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-05-05 08:50 @410

Publicidad

Re: Comparar palabras entre columnas

Notapor explorer » 2015-05-06 05:33 @273

Te falta este paso: "y que compare cada palabra de la primera columna con (todas) las palabras de la segunda columna".
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

Re: Comparar palabras entre columnas

Notapor DrGuero » 2015-05-06 07:42 @362

De momento no he conseguido plasmarlo. Si comparo números me aparecen solo las filas en las que por casualidad tenga alineadas las mismas palabras en la primera y en la segunda columna. Si comparo palabras el programa no me devuelve nada.

Por ahora estoy en este punto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. open(file,"file1.txt") or die ("error");
  3. while (<file>)
  4. {
  5. my @list=split(/\t/,$_);
  6. my $nom1=$list[0];
  7. my $nom2=$list[1];
  8.  
  9. foreach $nom1($nom1){
  10. if ($nom1 == $nom2){
  11.  
  12.  
  13. print "$nom1\t$nom2";
  14.                              }
  15.                                         }
  16.                    
  17.  
  18. }
  19. close (file) or die ("I cannot close the file");
  20.  
  21.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
He seguido tu consejo y he intentado usar el foreach. Lo que no sé es cómo hacer que una palabra de la primera columna recorra toda la segunda columna.

Gracias por tu paciencia, cualquier pista es apreciada.

Dr. Guero
DrGuero
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-05-05 08:50 @410

Re: Comparar palabras entre columnas

Notapor explorer » 2015-05-06 08:48 @408

Como se trata de buscar información en todas las líneas, lo primero que hay que hacer es leer y guardar todos los valores de todas las columnas.

Entonces, podrías recorrer con el while() todas las líneas del archivo, y por cada una de ellas, la divides en columnas, y vas guardando las columnas. Más tarde, cuando lo hayas leído todo, recorres los valores de la primera columna, y miras a ver si está entre los datos de la segunda columna.

Los datos los puedes guardar en un array, por ejemplo, pero este problema, el de recordar si un elemento lo hemos visto o no, es adecuado resolverlo con un hash.

Por ejemplo, si hemos metido los datos de la segunda columna en el hash %segunda_columna, entonces, para saber si existe una coincidencia entre un valor de la primera columna y alguna de la segunda, haríamos
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $valor (sort keys %primera_columna) {
  2.     if (exists $segunda_columna{$valor}) {
  3.         # ...
  4.     }
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Con la ayuda de keys() extraemos los valores de la primera columna. sort() los reordena alfabéticamente. Los valores son recorridos por el for, uno cada vez en $valor. En el if, preguntamos "¿existe $valor en la %segunda_columna?"

También se puede resolver con array, pero entonces debes hacer un doble bucle, para que se compare cada valor de la primera columna con todos los valores de la segunda.
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 Básico

¿Quién está conectado?

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

cron