有人能帮我用awk求一列的平均值吗

有人能帮我用awk求一列的平均值吗,awk,Awk,这假定您的输入文件如下所示: $ awk '$2 == 0 { total += $3; count++;} END { print total/count; }' CLN_Tapes_LON 3 只是为了好玩,让我们看看你的原始版本有什么问题,然后一步一步地将它转换成可以工作的东西。这是您的初始版本(我称之为版本0): -F,将字段分隔符设置为逗号字符,但后面的注释似乎表明列(字段)由空格分隔。所以,让我们摆脱它;默认情况下,awk期望使用空格分隔。第1版: awk -F, '{if ($

这假定您的输入文件如下所示:

$ awk '$2 == 0 { total += $3; count++;} END { print total/count; }' CLN_Tapes_LON 
3

只是为了好玩,让我们看看你的原始版本有什么问题,然后一步一步地将它转换成可以工作的东西。这是您的初始版本(我称之为版本0):

-F,
将字段分隔符设置为逗号字符,但后面的注释似乎表明列(字段)由空格分隔。所以,让我们摆脱它;默认情况下,awk期望使用空格分隔。第1版:

awk -F, '{if ($2 == 0) awk '{ total += $3; count++ } END { print total/count }' CLN_Tapes_LON; }' /tmp/CLN_Tapes_LON
您似乎试图在awk程序中嵌套对awk的调用?几乎从来没有人要求这样做,而且无论如何,这也不是这样做的方式。同时,让我们去掉不匹配的引号:顺便注意,您不能将单引号嵌套在另一对单引号中:您必须以某种方式将它们转义。但这里根本不需要它们。第2版:

awk '{if ($2 == 0) awk '{ total += $3; count++ } END { print total/count }' CLN_Tapes_LON; }' /tmp/CLN_Tapes_LON
这很接近,但并不完全正确:
END
块仅在所有输入行都完成处理时才执行:如果
,将其放在
中是没有意义的。让我们把它移到支架外面。我还将收紧一些空白。第3版:

awk '{if ($2 == 0) { total += $3; count++ } END { print total/count } }' /tmp/CLN_Tapes_LON
第3版实际上是有效的,你可以到此为止。但是awk有一种简便的方法,可以指定只对符合条件的行运行代码块:
'condition{code}
,因此您的代码可以更简单地写成:

awk '{if ($2==0) {total+=$3; count++}} END{print total/count}' /tmp/CLN_Tapes_LON

。。。当然,这正是John1024的建议。

认为我应该在没有awk的情况下尝试这样做。Awk显然是更好的选择,但它仍然是一个单一的班轮

awk '$2==0 {total+=$3; count++} END{print total/count}' /tmp/CLN_Tapes_LON

bccat/tmp/CLN_磁带\u LON CLH040 0 3 CLH041 0 3 CLH042 0 3 CLH043 0 3 CLH010 1 0 CLH011 0 CLH012 1 0 CLH013 1 0 CLH130 1 40 CLH131 1 40 CLH132 1 40 CLH133 1 40已经很好地澄清了..谢谢。我喜欢阅读一步一步的解释,帮助OP理解他错在哪里,从而帮助他在将来避免这些错误。
awk '{if ($2==0) {total+=$3; count++}} END{print total/count}' /tmp/CLN_Tapes_LON
awk '$2==0 {total+=$3; count++} END{print total/count}' /tmp/CLN_Tapes_LON
bc<<<"($(grep ' 0 ' file|tee >(wc -l>i)|cut -d\  -f3|tr '\n' '+')0)/"$(<i)

3