对输入列表进行排序
问题描述:
我有一个由跟踪指标的系统提供的输入列表。我需要对它进行排序,以便移除低于给定阈值的使用情况数据,我真的不知道如何处理它。提供给我的数据应该看起来类似于:对输入列表进行排序
ID Usage Estimated Cost
------------------------------------------------------------------
University Name 260000 1600.00
第一个字段将是一个名称,以下两个字段将是整数值。 我正在考虑尝试创建列表清单,但可能有一个更简单的方法。 我将如何去除只获取3个字段并按使用率值对它们进行排序?
答
列表列表非常简单。
my @list;
while(<>) {
push @list, [$_,(split(/\s+/,$_,3))[1]];
}
foreach my $out (sort {$a->[1] <=> $b->[1]} @list) {
print $out->[0];
}
答
标准方法是创建散列列表。在你的情况,你会输入文件转换成的东西:
my @records = (
{ ID => "University Name", Usage => 260000, EstCost => 1600.00 },
{ ID => "...", Usage => 12345, EstCost => 9999.99 },
...
);
然后对它们进行排序(按使用EG)与类似的代码:
my @sorted = sort { $a->{Usage} <=> $b->{Usage} } @records;
然后用类似的代码创建一个从排序记录的报表:
for my $r (@sorted) {
print "ID: ", $r->{ID}, ..., "\n";
}
你可以走捷径,如果你想要的,但将每个行成一个哈希有几个优点:
- 它使你的代码更易于阅读,理解和修改 - 也就是说,它是明显的
sort { $a->{Usage} <=> $b->{Usage} ...
各种各样的用途 - 有其于哈希表操作,所以许多其他图书馆,即有其转换哈希表库CSV文件或HTML表格或纯文本表或将行插入数据库等。
答
您可以记住整行,因此不必再次格式化。此外,只记得和它的使用价值超过阈值的行进行排序:
perl -ane 'BEGIN { $threshold = 2000 } # Insert your value here.
next if 1 .. 2 or $F[-2] < $threshold; # Skip the header and filtered lines.
push @A, [ $F[-2], $_ ]; # Remember the usage and the whole line.
}{ # At the end...
print map $_->[1],
sort { $a->[0] <=> $b->[0] } @A'
你需要排序,或者你可以使用Perl的'grep'建立,只有达到或超过阈值具有用途清单? – DavidO