http://www.perlmonks.org?node_id=965812


in reply to Sort on Table headers

You can coax a Schwartzian transform into doing this work for you:

use strict; use warnings; map{print $_->[0]} sort{$a->[1] <=> $b->[1] || $a->[2] <=> $b->[2]} map{[$_, (split /\t/)[2], (split /\t/)[3]]} <DATA>; #ID distance score value start stop done remainin +g __DATA__ N_425 614 17.01 425 40 12 308 322 N_542 1290 18.74 542 53 15 237 251 N_372 870 15.66 372 80 15 262 276 N_236 814 15.65 236 69 13 185 200 N_991 814 14.65 9 69 13 185 200 N_992 814 14.65 8 69 13 185 200 N_993 814 14.65 7 69 13 185 200 N_994 814 14.65 6 69 13 185 200 N_995 814 14.65 5 69 13 185 200

Results:

N_995 814 14.65 5 69 13 185 200 N_994 814 14.65 6 69 13 185 200 N_993 814 14.65 7 69 13 185 200 N_992 814 14.65 8 69 13 185 200 N_991 814 14.65 9 69 13 185 200 N_236 814 15.65 236 69 13 185 200 N_372 870 15.66 372 80 15 262 276 N_425 614 17.01 425 40 12 308 322 N_542 1290 18.74 542 53 15 237 251

Thank you, scorpio17, for the extended data set; and the sorting routine here is essentially the same as yours.

Hope this helps!