awk は、2 番目の列のキーに基づいて列の平均を計算します。

awk は、2 番目の列のキーに基づいて列の平均を計算します。

私は持っています

Sample_A   100
Sample_A   200
Sample_B   300
Sample_B   100

1行の各キーについて、2行の値の平均を印刷したいと思います。

Sample_A   150
Sample_B   200

他の質問に対する優れた答えを使用して、行1の各キーに対して行2の値の合計を印刷できます。 2番目の列に基づいて最初の列の合計を取得します。

コマンドは次のとおりです。

awk 'NR { k = $1; cnt[k] += $2 } END { print; for (k in cnt) print k,cnt[k]}' File.txt

これは生産します

Sample_A  300
Sample_B  400

ただし、平均を計算するには、次のようにキー発生回数を保存する方法が必要です。

awk 'NR { k = $1; cnt[k] += $2; count(k)=$2} END { print; for (k in cnt) print k,cnt[k]/count(k)}' File.txt

しかし、私のcount(k)コードは少し目が遠く動作しません。

答え1

一緒にawkできること:

awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' infile
Sample_A 150
Sample_B 200

またはGNUを使用してくださいdatamash:

datamash -t' ' --sort --group 1 mean 2 <infile
Sample_A 150
Sample_B 200

答え2

$ awk '{ sum[$1] += $2; count[$1] += 1 } END { for ( key in count ) { print key, sum[key] / count[key] } }' input
Sample_A 150
Sample_B 200

平均を導出するには、平均を求めるエンティティの数とその値の合計の2つが必要です。count前者の場合は配列を使用し、sum後者の場合は配列を使用します。各配列のキーは、データファイルの最初の列に割り当てられます。

END次に、データを収集した後、句を使用して各配列を調べ、合計と数を取得し、ある配列を別の配列に分割し、結果を表示します。

スクリプトawkはもう1行に表示されなくなり、次のように再フォーマットされています。

{ 
  sum[$1] += $2 
  count[$1] += 1
} 
END { 
  for (key in count) { 
    print key, sum[key] / count[key] 
  } 
}

関連情報