#!/usr/bin/perl -w
use strict;
unless ( @ARGV == 1 && -f -r $ARGV[0] ) {
die "Expected single file argument!\n";
}
my %cols;
my $ind = 0;
while (<>) {
chomp;
next if /^\s*($|#)/;
( @{ $cols{col1} }[$ind], @{ $cols{col2} }[$ind], @{ $cols{col3} }[$ind] ) = split;
$ind++;
}
my @sorted1 = map { ${ $cols{col1} }[$_] } sort {
${ $cols{col1} }[$a] <=> ${ $cols{col1} }[$b] or
${ $cols{col2} }[$a] <=> ${ $cols{col2} }[$b] or
${ $cols{col3} }[$a] <=> ${ $cols{col3} }[$b]
} keys @{ $cols{col1} };
my @sorted2 = map { ${ $cols{col2} }[$_] } sort {
${ $cols{col1} }[$a] <=> ${ $cols{col1} }[$b] or
${ $cols{col2} }[$a] <=> ${ $cols{col2} }[$b] or
${ $cols{col3} }[$a] <=> ${ $cols{col3} }[$b]
} keys @{ $cols{col2} };
if ( "@sorted1" eq "@{ $cols{col1} }" and "@sorted2" eq "@{ $cols{col2} }") {
print "File is sorted!\n"
}
else { print "File is unsorted!\n" };
__END__
Se as colunas forem:
X1 Y1 Z1
X2 Y2 Z2
A classificação será:
se (x1 > x2) então X1 Y1 Z1
> X2 Y2 Z2
if (X1 == X2) & & (Y1 > Y2) então X1 Y1 Z1
> X2 Y2 Z2
Para adicionar mais colunas à ordem de classificação, copie o padrão para os dois primeiros. Espero que seja o que você pediu.