排序输入列表

时间:2012-11-02 17:24:07

标签: perl

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

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

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

3 个答案:

答案 0 :(得分:2)

列表清单非常简单。

my @list;
while(<>) {
    push @list, [$_,(split(/\s+/,$_,3))[1]];
}
foreach my $out (sort {$a->[1] <=> $b->[1]} @list) {
    print $out->[0];
}

答案 1 :(得分: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'

答案 2 :(得分: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表格或纯文本表格或将行插入数据库等等。