#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; # Read the input. my @input; while (<>) { push @input, [ split ]; } # Sort by columns, save the line number. my @output = map [ $_->[0] ], @input; for my $c (1, 2) { my $x = 1; $output[$_][$c] = $x++ for sort { $input[$b][$c] <=> $input[$a][$c] } 0 .. $#input; } # Print the line numbers using the original order. for my $l (0 .. $#input) { say join "\t", @{ $output[$l] }; }