my @lines = split /\n/, <[0] } # extract lines back out sort { # sort on split columns $a->[1][0] cmp $b->[1][0] # index 0 is 'col1' || $a->[1][1] cmp $b->[1][1] # col2 || $a->[1][4] cmp $b->[1][4] # col5 } map { [ $_ => [ split /\s+/, $_ ] ] } # [ 'line1' => ['col1',...] ] @lines; print "$_\n" foreach @lines;