1

キーと値のペアの値をカウントしているときにうまく機能する awk reducer プログラムを以下に示します。

#!/bin/awk -f

BEGIN {FS="\t";
}
{       A[$1]+=$2;      
}
END {
        for(i in A)    
        {printf("%s\t %d\n" ,i ,A[i])}
}

上記のレデューサーはうまく機能しますが、それを書くための最適化された方法はありますか...?

入力:

APPLE 1
APPLE 1
 1
ORANGE  1
ORANGE  1
MANGO 1
BANANA 1
 1
 1
 1
ORANGE  1
 1
APPLE 1
BANANA 1

出力:

APPLE 3
BANANA 2
MANGO 1
ORANGE 3
 5
4

2 に答える 2

1

最適化の定義に依存します-現在のソリューションは、結果セット全体を連想配列で維持する必要があるという点で制限されています。別のアプローチは、フィールド 1 を前の値と比較し、一致する場合はカウントを更新し、一致しない場合は前の値とカウントを出力することです。このメソッドを使用すると、結果をそのまま出力できます。このアルゴリズムを使用した場合のパフォーマンス コストはわかりませんが、前に述べたように、メモリ制限はありません。

BEGIN {
  FS = "\t";
  OFS = "\t";
}
{ 
  if ($1 != prev) { 
    if (prev != "") { print prev, count;} 
    prev=$1; 
    count=0;
  }
  count += $2 
}
END { 
  print prev, count
}
于 2013-07-28T17:08:42.743 に答える
0
BEGIN {FS="\t"; OFS="\t "}
{ A[$1]+=$2 }
END {
    for(i in A)    
        print i, A[i]
}

もちろん、入力データと実際に探している最適化の種類に応じて、代替手段がある場合があります。

于 2013-07-28T23:39:54.103 に答える