如何在Perl中按列对数组或表排序?

丽莎

我一直在到处寻找答案,但是我无法使其正常工作。

我有一个使用perl读入数组的输入文件。该文件是包含表的文本文件。Perl将其作为数组读取,每个元素都是整行(包括所有五列)。这是数组的样子:

0__len__340   16    324    0    0.0470588235294118
1__len__251   2     249    0    0.00796812749003984
2__len__497   0     497    0    0
3__len__55    7     48     0    0.127272727272727
4__len__171   0     171    0    0
5__len__75    0     75     0    0
6__len__160   75    85     0    0.46875
7__len__285   1     284    0    0.00350877192982456
8__len__94    44    50     0    0.468085106382979

我需要按降序按最后一列对该表进行排序。所以我的输出应该是:

6__len__160   75    85     0    0.46875
8__len__94    44    50     0    0.468085106382979
3__len__55    7     48     0    0.127272727272727
0__len__340   16    324    0    0.0470588235294118
1__len__251   2     249    0    0.00796812749003984
7__len__285   1     284    0    0.00350877192982456
2__len__497   0     497    0    0
4__len__171   0     171    0    0
5__len__75    0     75     0    0

我尝试了几种方法,但都没有奏效。这是我尝试过的代码:

@input = <FILENAME>;
#Close the file
close FILENAME;
my @fractions;
my $y = 0;
for (my $x = 1; $x <= $#input; ++$x) {
    $fractions[$y] = (split (/\s/,$input[$x]))[4];
    ++$y;
}
my @sorted = sort {$b <=> $a} @fractions;
my $e = 1;
my $z = 0;
my $f = 0;
my @final;
 do {
    do {
        if ((split (/\s/,$input[$e]))[4] == $sorted[$z]){
            $final[$f] = $input[$e];
            ++$e;
            ++$f;
        } else { 
            ++$e;
        }
    } until ($e > $#input); 
    do {
        ++$z;
    } until ($sorted[$z] != $sorted[$z - 1]);
$e = 0;
} until ($z > $#sorted);
for (my $h = 0; $h <= $#final; ++$h) {
    print $final[$h] . "\n\n";

}

通过这个,我基本上尝试将第5列数字放入他们自己的数组中,对它们进行排序,然后返回原始数组,并取出与排序后的数组匹配的元素,然后将它们放入最终数组中。如果我继续努力,这可能会奏效,但是运行时间太长,不切实际。我用来测试我的代码的这个小表花了很长时间才能运行,一旦代码正常工作,它将处理具有数百万行的表。

我也尝试将sort命令应用于表本身,但是我的输出与我的输入是完全相同的表...它没有被排序。

@input = <FILENAME>;
close FILENAME;
my @sorted = sort { $b->[4] <=> $a->[4] } @input;
for (my $h = 0; $h <= $#sorted; ++$h) {
    print $sorted[$h] . "\n\n";
}
exit;

最后,由于第一列名称是唯一的,而值是第五列,所以我试图将数组放入哈希,其中键是前四列。然后,我希望我可以按值对散列进行排序,并且键将与分配的值保持一致。尽管不幸的是几天前,但我还是删除了代码,但我也无法使它正常工作。一个问题是我无法弄清楚如何仅在第五列之前拆分字符串,所以我最终得到了两个字符串,一个包含前四列,一个包含第五列。

可以向我展示我使用sort命令有什么问题的人,或者可能对如何执行此操作有更好的主意的人,我将非常感谢您的帮助!

干27

在上一个代码示例中,您可以替换

my @sorted = sort { $b->[4] <=> $a->[4] } @input;

my @sorted = sort { (split(' ', $b))[4] <=> (split(' ', $a))[4] } @input;

甚至

my @sorted = sort { (split(/\s+/, $b))[4] <=> (split(/\s+/, $a))[4] } @input;

如果输入数据的行前没有空格。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章