Hola a todos,
Planteo aquí un problema que seguramente será muy básico, pero en el que me he atascado como el tontaina que soy.
Pretendo filtrar una lista donde aparece el mismo nombre varias veces pero con valores diferentes y quiero quedarme con el menor de los valores que aparecen para cada nombre.
Este sería un ejemplo de la lista.
Using text Syntax Highlighting
IDX2 10
IDX4 11
IDX5 12
IDX7 14
IDX12 15
IDX2 10
IDX4 11
IDX5 12
IDX7 14
IDX5 17
IDX6 2
IDX12 37
IDX6 4
IDX12 5
IDX5 6
IDX5 8
IDX6 9
IDX12 15
IDX2 16
IDX4 17
IDX5 18
IDX6 19
IDX7 20
IDX12 21
IDX2 16
IDX4 17
IDX5 18
IDX6 19
IDX7 20
IDX12 21
IDX5 0.1
IDX6 0.2
IDX12 0.3
IDX2 0.10
IDX4 0.11
IDX7 0.14
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Escribí un código pero los resultados me salen duplicados (es decir para cada nombre de la lista me sale el menor valor pero también otro...)
Ejemplo de resultado erróneo:
Using text Syntax Highlighting
IDX12 5
IDX5 6
IDX5 0.1
IDX6 0.2
IDX12 0.3
IDX2 0.10
IDX4 0.11
IDX7 0.14
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Aquí va el código:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Getopt::Long;
#usage: perl /path_to/hash_order.pl -t /path_to/file.txt
my ( $target);
GetOptions(
'table=s' => \$target,
);
open(INFILE,"$target") or die ("ERROR: $!\n");
chomp (my @lineas = <INFILE>);
open SALIDA,'>/path_to/hash_order.txt' or die "ERROR: $!\n";
my %unique=();
for(@lineas){
if (/^\w+/){
my ($feat,$pval) = split(/\t/, $_);
print "$feat\n";
my $href=\%unique;
&comphash ($feat,$pval,$href)
}
}
sub comphash{
my($feat,$pval,%{href})=@_;
if(exists $unique{$feat}){
if($pval< $unique{$feat}){
$unique{$feat}=$pval;
print SALIDA "$feat\t $unique{$feat}\n";
}else{
next;
}
}else{
$unique{$feat}="$pval";
#print SALIDA "$feat\t $unique{$feat}\n";
}
}
Coloreado en 0.010 segundos, usando
GeSHi 1.0.8.4
¿Me podéis ayudar a encontrar el error?
Mil Gracias