#!/usr/local/bin/perl use strict; use warnings; use Data::Dumper; my (%HoA, %lines); while (my $line = ) { my ($value, $key) = split /:/, $line, 3; push @{$HoA{$key}}, $value; $lines{"$key $value"} = $line # This could be done better } for my $country (keys %HoA) { my @list = sort { $b <=> $a } @{$HoA{$country}}; # This could be done better for my $ind (0 .. 3) { # This could be done better my $popu = $list[$ind] or next; print $lines{"$country $popu"}; } } __DATA__ 20470:ZM:Samfya:Africa 20149:ZM:Sesheke:Africa 18638:ZM:Siavonga:Africa 26459:ZW:Beitbridge:Africa 37423:ZW:Bindura:Africa 699385:ZW:Bulawayo:Africa 47294:ZW:Chegutu:Africa 61739:ZW:Chinhoyi:Africa 18860:ZW:Chipinge:Africa 28205:ZW:Chiredzi:Africa