use strict; use warnings; my (@data, %identifier); while () { chomp; @_ = split /\s+/, $_, 6; push @data, [@_]; $identifier{$_[0]} = $data[-1]; # Index for first field } # Sort on multiple fields, in this case fifth and first... print "@$_\n" for sort {$a->[4] cmp $b->[4] || $a->[0] <=> $b->[0]} @data; __DATA__ 1 1023 T C cc Item 1 2 1560 T C aa Item 2 3 9102 T C bb Item 3 4 11222 T C ff Item 4 7 13456 T C bb Item 7