使用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打印最后一行应该有平均数量…