我有这个数据文件,我想通过制作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
我不确定我是否理解这个问题。你想得到两个结果吗?
如果不明显的话阿彻玛的回答可以扩展以收集多个统计信息:
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}' < infile