use strict; use warnings; my %cat; while () { next if ! /^(\d+)\s+(\d+)$/; $cat{$1} = $2; } my @order = sort { $cat{$a} && $cat{$b} ? $a <=> $b : $cat{$a} <=> $cat{$b} || $a <=> $b } keys %cat; printf "%-3d %-3s\n", $_, $cat{$_} for @order; __DATA__ 70 3 72 10 74 8 76 11 77 6 90 12 91 8 92 10 93 9 78 0 75 0 73 0 71 0 #### 71 0 73 0 75 0 78 0 70 3 72 10 74 8 76 11 77 6 90 12 92 10 93 9