我一直在到处寻找答案,但是我无法使其正常工作。
我有一个使用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命令有什么问题的人,或者可能对如何执行此操作有更好的主意的人,我将非常感谢您的帮助!
在上一个代码示例中,您可以替换
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] 删除。
我来说两句