awk - 有人可以帮助我在其他列上使用 awk 获得列的平均值吗

标签 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

最佳答案

只是为了好玩,让我们看看您的原始版本有什么问题,然后逐步将其转换为可用的版本。这是您的初始版本(我将其称为版本 0):

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

-F, 将字段分隔符设置为逗号字符,但您后面的评论似乎表明列(字段)由空格分隔。所以让我们摆脱它; whitespace-separation 是 awk 默认期望的。版本 1:

awk '{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) { total += $3; count++ } END { print total/count } }' /tmp/CLN_Tapes_LON

这很接近但不太正确:END block 仅在所有输入行处理完毕后执行:将它放在 if。所以让我们把它移到大括号外面。我还要收紧一些空白。版本 3:

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

第 3 版确实有效,您可以到此为止。但是 awk 有一个方便的方法来指定只针对符合条件的行运行代码块:'condition {code}' 所以你可以更简单地写成:

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

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

关于awk - 有人可以帮助我在其他列上使用 awk 获得列的平均值吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29911738/

相关文章:

sorting - 如何比较两个文件并打印两个文件不同的值

bash - 使用 join/awk/sed 合并 CSV 文件

linux - 在linux文件中仅打印6个和10个字符的单词

bash - 替换字符串每第 n 次出现的位置

regex - 逐行解析文件中的关键字符并复制行

linux - 根据匹配模式将一行行 grep 到 shell 变量中

用于检查字符串是否在文件中的 Ruby 脚本?

windows - 如何获取非常不寻常的格式文本文件的必要值?

error-handling - awk 可以跳过不存在的文件,无竞争吗?

regex - 我们真的可以没有惰性量词吗?