use strict; use warnings; use Data::Dump::Streamer; my @array = ; chomp @array; my %uniq; for (@array) { my @parts = split "\t"; next if @parts < 3; next if exists $uniq{$parts[0]} and $uniq{$parts[0]}{val} < $parts[2]; $uniq{$parts[0]} = {val => $parts[2], data => $_}; } Dump (\%uniq); __DATA__ 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