I was tempted to go for a Fortran web service with SQL (http://fortran.io), but I settled for a solution using Data::Table.
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Table;
# Giving '0' as the second arg to Data::Table::fromTSV,
# results in a Data::Table with column names of col1, col2 and col3
my $t = Data::Table::fromTSV("data.tsv", 0);
my $nrow = $t->nofRow;
my @row_numbers = 1..$nrow;
# Sort by 'col2' as numeric values in decending order
$t->sort( 'col2', 0, 1 );
# Add a new column that contains the row indices for the 'col2' sort o
+rder
$t->addCol( \@row_numbers, 'col2order' );
# Sort by 'col3' as numeric values in decending order
$t->sort( 'col3', 0, 1 );
# Add a new column that contains the row indices for the 'col3' sort o
+rder
$t->addCol( \@row_numbers, 'col3order' );
# Sort by 'col1' as string values in ascending order
$t->sort( 'col1', 1, 0 );
# Get a subtable with the columns of interest
my $result = $t->subTable( undef, [ 'col1', 'col2order', 'col3order' ]
+ );
print $result->tsv;
exit;
This input is in
data.tsv:
a 23 11
b 24 15
c 16 19
d 8 2
e 40 41
The output is:
col1 col2order col3order
a 3 4
b 2 3
c 4 2
d 5 5
e 1 1