有人可以帮助我在其他列上使用带有条件的awk来获得列的平均值

时间:2015-04-28 06:18:45

标签: awk

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

awk: {if ($2 == 0) awk {
awk:                   ^ syntax error
bash: count++: command not found

3 个答案:

答案 0 :(得分:3)

只是为了好玩,让我们看看你的原始版本有什么问题,并将其转化为有效的,一步一步的。这是你的初始版本(我称之为版本0):

-F,

awk '{if ($2 == 0) awk '{ total += $3; count++ } END { print total/count }' CLN_Tapes_LON; }' /tmp/CLN_Tapes_LON 将字段分隔符设置为逗号字符,但后面的注释似乎表示列(字段)由空格分隔。让我们摆脱它;空白分离是awk默认的预期。版本1:

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

您似乎试图在awk程序中嵌入对awk的调用?几乎从来没有任何要求,无论如何这都不是这样做的方式。在我们处理时,让我们摆脱不匹配的引号:请注意,你不能将单引号嵌入另一对单引号中:你必须以某种方式逃脱它们。但这里根本不需要它们。第2版​​:

END

这很接近但不太正确:if块仅在所有输入行完成处理时执行:将它放在awk '{if ($2==0) {total+=$3; count++}} END{print total/count}' /tmp/CLN_Tapes_LON 中是没有意义的。所以让我们把它移到大括号外面。我也要收紧一些空白。第3版:

'condition {code}'

版本3实际上有效,你可以在这里停下来。但是awk有一种方便的方法来指定只针对符合条件的行运行代码块:awk '$2==0 {total+=$3; count++} END{print total/count}' /tmp/CLN_Tapes_LON 所以你可以更简单地写成:

0xFFD8F...6DC0676

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

答案 1 :(得分:0)

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

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

$ cat CLN_Tapes_LON 
CLH040 0 3
CLH041 0 3
CLH042 0 3
CLH043 0 3
CLH010 1 0
CLH011 1 0
CLH012 1 0
CLH013 1 0
CLH130 1 40
CLH131 1 40
CLH132 1 40
CLH133 1 40

答案 2 :(得分:0)

我以为没有awk就试着这样做。 Awk显然是更好的选择,但它仍然是一个单行。

bc<<<"($(grep ' 0 ' file|tee >(wc -l>i)|cut -d\  -f3|tr '\n' '+')0)/"$(<i)

3

它使用0在第二列中提取grep行。这将传递给tee wc -l以计算行数,并传递给cut以提取第三列。 tr用&#34; +&#34;替换新行。它被放在行数上(即&#34; 12/4&#34;)。然后将其传递给bc