是否可以使用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
awk 'NR==1 {sum+=NF} END {print(sum/NF)}' average.txt
ut6juiuv1#
就像这样:
$ awk 'NR==1{for (i=1; i<=NF; i++) sum+=$i}END{print sum/NF}' file 5.66667
lb3vh1jj2#
我想解释一下你的代码实际上在做什么。NF内置变量保存当前行中的文件数,因此对于文件average.txt
NF
代码
在第一行中,会将总和增加字段数(在提供的文件中为3),然后在处理完所有文件后,会将该值除以最后一行中的字段数,换句话说,您的代码会计算第一行中字段数与最后一行中字段数的比率。如果您想了解更多关于NF的信息,请阅读8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
omhiaaxx3#
您可以循环遍历所有字段和sum up所有值。如果只想处理第一条记录,可以直接打印该值,然后退出awk。要防止出现被零除的异常,可以检查字段数是否大于0
sum
awk 'NR==1 && NF>0 {for (i=1; i<=NF; i++) sum+=$i; print sum/NF; exit}' average.txt
rbpvctlc4#
还有另一个解决方案。如果只有第一行是你感兴趣的,那么对我来说在每一行上循环似乎是没有用的。相反,只需head -1包含您的数据的文件,如下所示(此处,文件名为test):
head -1
test
head -1 test | awk '{for (i=1; i<=NF; i++) sum+=$i; print sum/NF}'
在这里,awk命令基本上是从其他答案复制/pasta,但没有所有的NR=1的东西。
4条答案
按热度按时间ut6juiuv1#
就像这样:
lb3vh1jj2#
我想解释一下你的代码实际上在做什么。
NF
内置变量保存当前行中的文件数,因此对于文件average.txt代码
在第一行中,会将总和增加字段数(在提供的文件中为3),然后在处理完所有文件后,会将该值除以最后一行中的字段数,换句话说,您的代码会计算第一行中字段数与最后一行中字段数的比率。如果您想了解更多关于
NF
的信息,请阅读8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNRomhiaaxx3#
您可以循环遍历所有字段和
sum
up所有值。如果只想处理第一条记录,可以直接打印该值,然后退出awk。
要防止出现被零除的异常,可以检查字段数是否大于0
rbpvctlc4#
还有另一个解决方案。如果只有第一行是你感兴趣的,那么对我来说在每一行上循环似乎是没有用的。
相反,只需
head -1
包含您的数据的文件,如下所示(此处,文件名为test
):在这里,awk命令基本上是从其他答案复制/pasta,但没有所有的NR=1的东西。