#!perl use strict; my %hash=(); while (){ my ($spec,$sub,$id,$pc) = split; push @{$hash{$spec}{$sub}},[$id,$pc]; } for my $spec (sort keys %hash){ for my $sub (sort keys %{$hash{$spec}}){ my @f = sort {$b->[1] <=> $a->[1]} @{$hash{$spec}{$sub}}; printf "%s %s %s %s\n",$spec,$sub,@{$f[0]}; } }