1

我有一个以制表符分隔的文本文件,其格式、名称和年龄如下所示:

chris     19
bobby     29
doofus    67

我想拉入文本文件,然后通过第二个字段进行排序。我可以拉入文本文件并格式化数据,但我无法正确排序,因此删除了我拥有的排序代码......

这是简单的文件拉取:我该如何修改它?

open (FILEHERE, 'ages.txt');
while (<FILEHERE>) {
chomp;
my($n, $s) = split("\t");
print "$a\t $s";
}
close (FILEHERE);
4

4 回答 4

4

施瓦茨变换(ST) 在这里可以提供帮助:

use strict;
use warnings;

my $data = <<END;
chris     19
doofus    67
bobby     29
END

open my $fh, '<', \$data or die $!;

print map $_->[0],
sort { $a->[1] <=> $b->[1] }
map { [ $_, /(\d+)$/ ] }
<$fh>;

close $fh;

输出:

chris     19
bobby     29
doofus    67

从 ST 的底部向上阅读。该例程获取一个文件行,然后map将该行作为匿名数组的第一个元素放在其中。第二个元素是从第二列捕获的数值。采用sort匿名子例程对匿名数组的第二个元素进行排序(因此,取消引用箭头运算符$a->[1])。结果被传递给map访问排序的行,最终打印出来。

希望这可以帮助!

于 2012-11-20T18:15:09.373 回答
1

您可以将文件读入数组引用数组,然后根据每个数组的第二个字段进行排序:

my @lines;
open (FILEHERE, 'ages.txt');
while(<FILEHERE>) {
    push @lines, [split /\t/];
}

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

或者,假设您的数据已正确排序,并且只需从标准输入中读取,则可能更容易编写 Perl 脚本:sort -grk2 ages.txt | perl yourscript.pl

于 2012-11-20T18:11:59.663 回答
1

来自如何在 perl 中按列对数组或表进行排序?应该管用:

perl -anE 'push @t,[@F]}{ say "@$_" for sort {$a->[1] <=> $b->[1]} @t' names.txt

与@reo katoa 一样,它使用数组数组 - 但利用-a将行自动拆分为@F第一个。有关perlrun自动拆分的详细信息,请参阅。

于 2014-11-25T20:47:27.410 回答
0

您还可以调用sort -k 2,2perl 对第二个字段的文件进行排序,当然-n如果它们是数字则使用并-r进行反向排序。

我使用以下单线查看 squid 访问日志,它在顶部显示最长的会话

sort -rn -k 2,2 access.log | perl -lpe 's/^([0-9]{10})(.\d{3})/scalar localtime$1/e'
于 2014-01-02T05:40:17.937 回答