my %rows_by_id; while () { chomp; my %row; @row{qw( score id )} = ( split /\t/ )[ 0, 9 ]; my $id = $row{id}; push @{ $rows_by_id{$id} }, \%row; } for my $id (keys %rows_by_id) { # Add "sort" if desired my $rows = $rows_by_id{$id}; @$rows = sort { $b->{score} <=> $a->{score} } @$rows; my $best_row = $rows->[0]; print("Best score for id $id: $best_row->{score}\n"); }