使用awk查找列的平均值
我试图find一个类的awk
的第二列数据的平均值。 这是我现在的代码,我的教师提供的框架:
#!/bin/awk ### This script currently prints the total number of rows processed. ### You must edit this script to print the average of the 2nd column ### instead of the number of rows. # This block of code is executed for each line in the file { x=sum read name awk 'BEGIN{sum+=$2}' # The script should NOT print out a value for each line } # The END block is processed after the last line is read END { # NR is a variable equal to the number of rows in the file print "Average: " sum/ NR # Change this to print the Average instead of just the number of rows }
我得到一个错误,说:
awk: avg.awk:11: awk 'BEGIN{sum+=$2}' $name awk: avg.awk:11: ^ invalid char ''' in expression
我想我很近,但我真的不知道该从哪里出发。 代码不应该是非常复杂的,因为我们在课堂上看到的所有东西都是相当基础的。 请告诉我。
awk '{ sum += $2; n++ } END { if (n > 0) print sum / n; }'
将sum
$2
(第二列)中的sum
(通过awk
将variables自动初始化为零)并增加行数(也可以通过内置variablesNR处理)。 最后,如果至less有一个值被读取,则打印平均值。
awk '{ sum += $2 } END { if (NR > 0) print sum / NR }'
如果你想使用shebang符号,你可以写:
#!/bin/awk { sum += $2 } END { if (NR > 0) print sum / NR }
您也可以使用printf()
和适当的格式(例如"%13.6e\n"
printf()
来控制平均格式。
您也可以使用以下代码来概括代码以平均第N列(在本示例中N=2
):
awk -v N=2 '{ sum += $N } END { if (NR > 0) print sum / NR }'
您的具体错误是第11行:
awk 'BEGIN{sum+=$2}'
这是一个awk
被调用的行,并且指定了BEGIN
块 – 但是你已经在awk脚本中了,所以你不需要指定awk
。 你也想在每一行的input上运行sum+=$2
,所以你不希望它在BEGIN
块内。 因此,该行应简单地阅读:
sum+=$2
你也不需要行:
x=sum read name
第一个只是创build了一个名为x
的同义词,我不确定第二个是什么,但都不需要。
这将使你的awk脚本:
#!/bin/awk ### This script currently prints the total number of rows processed. ### You must edit this script to print the average of the 2nd column ### instead of the number of rows. # This block of code is executed for each line in the file { sum+=$2 # The script should NOT print out a value for each line } # The END block is processed after the last line is read END { # NR is a variable equal to the number of rows in the file print "Average: " sum/ NR # Change this to print the Average instead of just the number of rows }
Jonathan Leffler的回答给出了代表相同固定代码的awk单线程,并且检查是否至less有一行input(这会阻止除以零错误)。 如果
尝试这个:
ls -l | awk -F : '{sum+=$5} END {print "AVG=",sum/NR}'
NR是一个AWK内buildvariables来计算no。 的logging
awk 's+=$2{print s/NR}' table | tail -1
我正在使用tail -1
打印最后一行应该有平均数量…