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