this can be simplified (and will work with older perl-versions)
perl -F':' -lane '
push @{$h{$F[1]}}, [$F[0],$_] }{
print $_->[1] for map { ( sort {$b->[0] <=> $a->[0]} @$_ )[0..3] } val
+ues %h' file
20470:ZM:Samfya:Africa
20149:ZM:Sesheke:Africa
18638:ZM:Siavonga:Africa
699385:ZW:Bulawayo:Africa
61739:ZW:Chinhoyi:Africa
47294:ZW:Chegutu:Africa
37423:ZW:Bindura:Africa
Please note that countries with less than 4 cities will have empty lines.
But I'd rather prefer chaining only maps...
Cheers Rolf
( addicted to the Perl Programming Language)
update
to avoid empty lines skip the -l option
perl -F':' -ane '
push @{$h{$F[1]}}, [$F[0],$_] }{
print $_->[1] for map { ( sort {$b->[0] <=> $a->[0]} @$_ )[0..3] } val
+ues %h' file
20470:ZM:Samfya:Africa
20149:ZM:Sesheke:Africa
18638:ZM:Siavonga:Africa
699385:ZW:Bulawayo:Africa
61739:ZW:Chinhoyi:Africa
47294:ZW:Chegutu:Africa
37423:ZW:Bindura:Africa
elaboration
values instead of keys
(List)[slice] instead of splice
-l chomps and sets auto-newline in $\ |