2012-11-02 134 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'