2012-11-02 93 views
0

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

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

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

+0

你需要排序,或者你可以使用Perl的'grep'建立,只有达到或超过阈值具有用途清单? – DavidO

回答

2

列表列表非常简单。

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

标准方法是创建散列列表。在你的情况,你会输入文件转换成的东西:

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表格或纯文本表或将行插入数据库等。
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'