my (%dhash); # Lines assumed to be in @data, adapted from OP's code. open(DATA, $resolution) or die("Can't open $resolution for input: $!\n"); while (my $line = ) { my @parts = split(/&/, $line); if (exists($dhash{$parts[1]})) { $dhash{$parts[1]} += $parts[0]; } else { $dhash{$parts[1]} = 1; } } close(DATA); # Sample dump routine. open(DATA, '> ' . $resolution) or die("Can't open $resolution for output: $!\n"); foreach my $k (sort(keys(%dhash))) { printf DATA "%d&%s\n", $dhash{$k}, $k; } close(DATA);