use Sort::Key::Top 'rnkeytopsort'; my %countries; while( ) { my( $country ) = m/:([^:]{2}):/; push @{$countries{$country}}, $_; } print map { rnkeytopsort { /^(\d+):/; $1; } 4 => @{$countries{$_}} } keys %countries; __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 #### print do { my($c,$n) = ('',0); map { $_->[0] } grep { ($c,$n) = ($_->[2],0) if $_->[2] ne $c; $n++ < 4 } sort { $a->[2] cmp $b->[2] || $b->[1] <=> $a->[1] } map { [ $_, /^(\d+):([^:]{2}):/ ] } ; }; __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