use strict; use warnings; my %smallest = map { $_->[0] => { org => $_->[1], val => $_->[2] } } sort { $b->[2] <=> $a->[2] } map { chomp; [ split m{\t} ] } ; my @sorted = (); foreach my $protein ( sort keys %smallest ) { push @sorted, [ $protein, $smallest{$protein}->{org}, $smallest{$protein}->{val} ]; } print Data::Dumper->Dump([\@sorted], [qw{*sorted}]); __END__ protein1 organism1 0.843534 protein2 organism2 2.45 protein3 organism3 9.5322 protein4 organism4 0.3475474 protein1 organism6 9.4534 protein2 organism7 0.43534 protein2 organism8 1.2434 protein3 organism9 0.000003 protein3 orgnanism10 1.23325 #### @sorted = ( [ 'protein1', 'organism1', '0.843534' ], [ 'protein2', 'organism7', '0.43534' ], [ 'protein3', 'organism9', '0.000003' ], [ 'protein4', 'organism4', '0.3475474' ] );