我有一个文本文件,制表符分隔的格式,名称和年龄如下所示:
chris 19
bobby 29
doofus 67
我想拉入文本文件,然后通过第二个字段进行排序。我可以拉入文本文件,并格式化数据,但我无法正确排序,因此删除了我的排序代码......
以下是简单的文件提取:如何修改它?
open (FILEHERE, 'ages.txt');
while (<FILEHERE>) {
chomp;
my($n, $s) = split("\t");
print "$a\t $s";
}
close (FILEHERE);
答案 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
。