0

我有一个跟踪指标的系统提供的输入列表。我需要对其进行排序以删除低于给定阈值的使用数据,我真的不知道如何处理它。提供给我的数据应该类似于:

ID                    Usage                  Estimated Cost
------------------------------------------------------------------
University Name       260000                 1600.00

第一个字段是名称,接下来的两个字段是整数值。我正在考虑尝试创建列表列表,但可能有更简单的方法。我将如何删除仅获取 3 个字段并按使用值对它们进行排序?

4

3 回答 3

2

列表列表非常简单。

my @list;
while(<>) {
    push @list, [$_,(split(/\s+/,$_,3))[1]];
}
foreach my $out (sort {$a->[1] <=> $b->[1]} @list) {
    print $out->[0];
}
于 2012-11-02T17:44:28.427 回答
2

您可以记住整行,因此您不必再次对其进行格式化。另外,只记住并排序使用值超过阈值的行:

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'
于 2012-11-02T17:49:40.877 回答
1

标准方法是创建一个哈希列表。在您的情况下,您会将输入文件转换为:

my @records = (
  { ID => "University Name", Usage => 260000, EstCost => 1600.00 },
  { ID => "...", Usage => 12345, EstCost => 9999.99 },
  ...

);

然后使用如下代码对它们进行排序(例如按使用情况):

my @sorted = sort { $a->{Usage} <=> $b->{Usage} } @records;

然后使用以下代码从排序记录创建报告:

for my $r (@sorted) {
  print "ID: ", $r->{ID}, ..., "\n";
}

如果你愿意,你可以走捷径,但是将每一行转换成一个哈希有几个优点:

  • 它使您的代码更易于阅读、理解和修改——也就是说,很明显sort { $a->{Usage} <=> $b->{Usage} ...按用法排序
  • 还有很多其他库对哈希列表进行操作,即有一些库可以将哈希列表转换为 CSV 文件或 HTML 表或纯文本表或将行插入数据库等。
于 2012-11-02T17:44:51.437 回答