从文本文件perl中排序第二个字段降序

时间:2012-11-20 17:56:41

标签: perl sorting file-io text-files numeric

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

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 个答案:

答案 0 :(得分:2)

Schwartzian transform(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以访问已排序的行,最后打印出来。

希望这有帮助!

答案 1 :(得分:1)

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

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

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

或者,更简单的方法是编写Perl脚本,假设您的数据已正确排序,只需从stdin中读取:sort -grk2 ages.txt | perl yourscript.pl

答案 2 :(得分:0)

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

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

sort -rn -k 2,2 access.log | perl -lpe 's/^([0-9]{10})(.\d{3})/scalar localtime$1/e'

答案 3 :(得分:0)

来自How to sort an array or table by column in perl?的这一个班轮应该有效:

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

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