2016-12-17 13 views
0

データセットの一意のID($ 1)と測定($ 3)レコードを使用して、毎日($ 2)の繰り返しレコードの平均を計算する方法を教えてもらえますか?次のように データセットは、次のようになります。awkを使って1日以上の繰り返しレコードの平均を計算する方法は?

32070  2010-12-15 540 
32070  2010-12-15 546 
32070  2010-12-15 549 
32070  2010-12-17 579 
32070  2010-12-17 553 
25903  2010-12-15 556 
25903  2010-12-15 543 
25903  2010-12-15 564 
25903  2010-12-16 567 
25903  2010-12-16 583 

私はそれぞれの固有のID($ 1)の測定に基づいて、毎日の記録($ 2)の平均値($ 3)があり、ルックスとは別に、私の出力ファイルを印刷したいです以下のように、次のように:

32070 2010-12-15 545 
32070 2010-12-17 566 
25903 2010-12-15  554.33 
25903 2010-12-16  575 

答えて

2
$ cat tst.awk 
{ curr = $1 OFS $2 } 
curr != prev { if (cnt) print prev, sum/cnt; sum=cnt=0 } 
{ sum+=$3; cnt++; prev=curr } 
END { if (cnt) print prev, sum/cnt } 

$ awk -f tst.awk file 
32070 2010-12-15 545 
32070 2010-12-17 566 
25903 2010-12-15 554.333 
25903 2010-12-16 575 

これと@Ruslans答えとの違いであること:

  1. 彼のメモリに記憶し、全入力ファイル上ではわずか4つの変数(CURR、PREV、和の値を格納しながら、 cnt)をメモリに格納します。
  2. Hisは結果をランダムに入力します(実際にはほとんどのawk実装ではハッシュ)。
  3. あなたの入力がどんな順序で行われても、彼はあなたの入力がIDと日付でソートされていることに依存します。
+1

@ Ed Mortonありがとう – Alula

+0

スクリプトは、毎日のレコードを平均化することなく、そのまま私に与えてくれます。私はあなたの応答を楽しみにしています。ありがとう – Alula

+0

コピー/貼り付けに間違ったことがあったか、入力したサンプルがあなたが提供したサンプルのようなものではありません。あなたが私の答えで見ることができるように、スクリプトはあなたが提供したサンプル入力を頼んだものです。 –

0
BEGIN { SUBSEP = "@" } 

{ a[$1,$2] += $3; n[$1,$2]++ } 

END { 
    for (x in a) { 
    split(x, parts, SUBSEP) 
    print parts[1] " " parts[2] " " a[x]/n[x] 
    } 
} 

出力

25903 2010-12-15 554.333 
25903 2010-12-16 575 
32070 2010-12-15 545 
32070 2010-12-17 566 

説明

SUBSEPmultidimensional arraysのキーを分離するために使用される内部変数です。デフォルト値は"\034"で、入力には現われません。私はデバッグの目的で@に設定しました。この変数の変更はスキップできます。

"期待される出力"と比較して、出力の順序が異なります。しかし、sortツールで簡単にソートできます。例えば、以下は、(この順番で)最初の列で、次に、第二列で出力をソートします:

awk -f script.awk file | sort -k2 -k1g 

出力

25903 2010-12-15 554.333 
25903 2010-12-16 575 
32070 2010-12-15 545 
32070 2010-12-17 566 

これは単なるサンプルです。あなたは一般的な考えを持っているべきです。必要に応じてコマンドを変更します。

+0

ありがとうございます。できます。 – Alula

+0

もしあなたが何かにSUBSEPを設定したいなら、それをOFSに設定して、ENDセクションに 'split()'と 'parts'配列を必要としないならば、' x'インデックスをそのまま出力することができます通常の ''出力セパレータ 'の代わりにハードコーディングされた '' ''を取り除きます。 –

+1

@エドモートン、ありがとう。私は彼に一般的な考えを示したかっただけです。私はあなたのアドバイスが有用であると感じています。私はOPが役立つと思います。 –

関連する問題