• Publicidad

Comparar línea con línea siguiente

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

Re: Comparar línea con línea siguiente

Notapor jazstappung » 2012-02-24 09:21 @431

Mil gracias, explorer.
Me has ayudado mucho.

:D
Avatar de Usuario
jazstappung
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-23 13:29 @603
Ubicación: Santiago, Chile

Publicidad

Re: Comparar línea con línea siguiente

Notapor explorer » 2012-02-24 09:55 @455

Esta es otra versión, mucho más eficiente, ya que solo es necesario recorrer una sola vez las líneas del archivo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use File::Slurp;
  4.  
  5. my %hash;                       # Estructura que almacena las líneas
  6.                                 # Es un hash (indexado por los valores de la primera columna)
  7.                                 # cuyos valores son un array que guarda el valor numérico y
  8.                                 # un array con la lista de líneas coincidentes)
  9. my @file = read_file('kk.txt');
  10.  
  11. for (@file) {                               # Para todas las líneas
  12.     my($col1, $col4) = (split)[0,3];        # Extraemos la primera y cuarta columna
  13.  
  14.     if (                                    # Si...
  15.         not $hash{$col1}                    # nunca hemos vista esa primera columna,
  16.         or  $hash{$col1}[0] > $col4         # o la cuarta columna es menor que la teníamos recordada
  17.     ) {
  18.         $hash{$col1} = [ $col4, [ $_ ] ];   # guardamos la línea como la primera que asociamos al valor numérico
  19.     }
  20.     elsif (                                 # O si...
  21.         $hash{$col1}[0] == $col4            # es una línea que tiene el mismo número mínimo
  22.     ) {
  23.         push @{$hash{$col1}[1]}, $_;        # agregamos la línea a la lista de líneas con el mismo valor
  24.     }
  25. }
  26.  
  27. for my $col1 (sort keys %hash) {            # Para todas las primeras columnas...
  28.     for (@{$hash{$col1}[1]}) {              #     Para todas las líneas con la misma columna...
  29.         print;                              #         La imprimimos
  30.     }
  31. }
  32.  
  33. __END__
Coloreado en 0.003 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: Comparar línea con línea siguiente

Notapor jazstappung » 2012-02-24 11:59 @541

explorer, ¿existe alguna diferencia en cuanto a código si en columna 4 existen letras?

Debido a que hay algunos valores con e: 10e-4.


Gracias :D
Avatar de Usuario
jazstappung
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-23 13:29 @603
Ubicación: Santiago, Chile

Re: Comparar línea con línea siguiente

Notapor explorer » 2012-02-24 12:10 @548

10e-4 sigue la notación de los números en exponencial, así que no debería haber problemas, ya que la comparación se hace con operadores numéricos ('>').
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: Comparar línea con línea siguiente

Notapor jazstappung » 2012-02-24 13:51 @619

Cuando pruebo el archivo de prueba,
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
A       1       ABC     1e-12
A       4       XYZ     1e-12
A       9       QWE     1e-15
A       8       ASD     1e-18
A       8       POI     1e-12
B       1       AWE     1e-0
B       8       QWD     1e-1
C       3       ZSE     1e-15
D       2       MLP     1e-3
D       0       OKM     1e-4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

con el último código que subiste me arroja lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
A       8       ASD     1e-18
B       8       QWD     1e-1
C       3       ZSE     1e-15
D       0       OKM     1e-4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


:?
¿Por qué sucede esto?
Avatar de Usuario
jazstappung
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-02-23 13:29 @603
Ubicación: Santiago, Chile

Re: Comparar línea con línea siguiente

Notapor explorer » 2012-02-24 18:37 @817

De todas las líneas que comienzan por 'A', la que menor valor tiene en la cuarta columna, es la que tiene el valor 1e-18.

Y lo mismo para 'B', 'C' y 'D'.
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

Anterior

Volver a Básico

¿Quién está conectado?

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