gpt4 book ai didi

arrays - 如何在 Perl 中按列对数组或表进行排序?

转载 作者:行者123 更新时间:2023-12-04 18:06:15 25 4
gpt4 key购买 nike

我一直在到处寻找这个问题的答案,但我无法让它发挥作用。
我有一个使用 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;

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

关于arrays - 如何在 Perl 中按列对数组或表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com