0

メトリックを追跡するシステムによって提供されている入力リストがあります。特定のしきい値を下回る使用状況データを削除するために並べ替える必要がありますが、それにアプローチする方法が本当にわかりません。提供されるデータは次のようになります。

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

最初のフィールドは名前になり、次の 2 つのフィールドは整数値になります。リストのリストを作成しようと考えていましたが、おそらくもっと簡単な方法があります。3つのフィールドを取得して使用値でソートするだけで、どのように削除すればよいですか?

4

3 に答える 3

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 に答える
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 に答える
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 に答える