shell 用于查找特定行的平均值的awk脚本

azpvetkf  于 2022-12-13  发布在  Shell
关注(0)|答案(4)|浏览(175)

是否可以使用awk查找某行的平均值?例如,txt文件(average.txt)包含:

2 5 10
1 5 5
1 5 10

所以我只想求第一行的平均值:5,666667.
我试着这样做:awk 'NR==1 {sum+=NF} END {print(sum/NF)}' average.txt但输出错误:1

ut6juiuv

ut6juiuv1#

就像这样:

$ awk 'NR==1{for (i=1; i<=NF; i++) sum+=$i}END{print sum/NF}' file
5.66667
lb3vh1jj

lb3vh1jj2#

我想解释一下你的代码实际上在做什么。NF内置变量保存当前行中的文件数,因此对于文件average.txt

2 5 10
1 5 5
1 5 10

代码

awk 'NR==1 {sum+=NF} END {print(sum/NF)}' average.txt

在第一行中,会将总和增加字段数(在提供的文件中为3),然后在处理完所有文件后,会将该值除以最后一行中的字段数,换句话说,您的代码会计算第一行中字段数与最后一行中字段数的比率。如果您想了解更多关于NF的信息,请阅读8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

omhiaaxx

omhiaaxx3#

您可以循环遍历所有字段和sum up所有值。
如果只想处理第一条记录,可以直接打印该值,然后退出awk。
要防止出现被零除的异常,可以检查字段数是否大于0

awk 'NR==1 && NF>0 {for (i=1; i<=NF; i++) sum+=$i; print sum/NF; exit}' average.txt
rbpvctlc

rbpvctlc4#

还有另一个解决方案。如果只有第一行是你感兴趣的,那么对我来说在每一行上循环似乎是没有用的。
相反,只需head -1包含您的数据的文件,如下所示(此处,文件名为test):

head -1 test | awk '{for (i=1; i<=NF; i++) sum+=$i; print sum/NF}'

在这里,awk命令基本上是从其他答案复制/pasta,但没有所有的NR=1的东西。

相关问题