制作 awk 文件时如何指定列内的范围?

制作 awk 文件时如何指定列内的范围?

我有这个数据文件,我想通过制作awk文件来整理它。我想找到特定年龄范围内的平均比率。例如,来自 10<age<2020<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

相关内容