
このようなデータファイルがありますが、awk
ファイルを作成して整理したいと思います。特定の年齢の平均割合を求めたいです。たとえば、 10<age<20
と20<age<30
。これらの人の平均を計算する方法が見つかりません。どうすればいいですか?
name rate hours age sex
AIDAN 3.5 19 22 M
AMELIA 5.25 16 13 F
NOAH 4.5 24 25 M
ISABELLA 4.25 17 15 F
LIAM 4.5 23 23 M
AVA 5.5 24 25 F
CAYDEN 6 21 28 M
答え1
質問を理解したかどうかはわかりません。 2つの結果を得たいですか?
明らかでない場合アケマの答え複数の統計を収集するように拡張できます。
awk '($4 > 10) && ($4 < 20) { c10++; s10+=$2; }
($4 > 20) && ($4 < 30) { c20++; s20+=$2; }
END { if (c10>0) print "average for 10-20:", s10/c10
if (c20>0) print "average for 20-30:", s20/c20 }' …
- もちろん、変数を初期化するのは良いプログラミング習慣です。しかし、
awk
変数をnullに初期化することは、数学的文脈で使用されている場合はゼロのように機能するため、実際には必要ありません。 - Archemarが指摘したように
printf
。ただし、awk
デフォルト値(つまりprint
ステートメントを実装する方法)は合理的です。 - Archemarが指摘したように、範囲内に誰もいないとき(ただだけではありません)いいえ報告された平均)。
答え2
行を選択$4 < 20 && $4 > 10
awk 'BEGIN { c=0 ; s=0 ; }
($4 < 20) && ($4 > 10) { c++ ; s+=$2 ; }
END { if (c>0 ) printf "average %.1f\n",s/c ;}' ...
行を選択しないと、エラーメッセージが表示されます。
答え3
awk '{if ($4>=10&&$4<=20) {X=X+1;Y=Y+$2}} END {print Y/X}' < ファイル