my @oldlist = map {chomp; $_} ; my @sorted = map {$_->[2] . " " . $_->[1]} sort {($a->[0] cmp $b->[0]) || ($a->[2] cmp $b->[2]) || ($b->[1] cmp $a->[1])} map { [split] } @oldlist; #print join "\n", @sorted,"\n"; my @newlist = map {shift(@oldlist) . ' ' . $_} @sorted; print (join ("\t", split),"\n") for @newlist; __DATA__ a1 p1 qX5 a1 p1 q6 a1 p2 q4 a2 p3 q9 a2 p2 q8 a2 p2 q9 _OUTPUT__ a1 p1 qX5 q4 p2 a1 p1 q6 q6 p1 a1 p2 q4 qX5 p1 a2 p3 q9 q8 p2 a2 p2 q8 q9 p3 a2 p2 q9 q9 p2