awk 什么时候将换行符视为“;”,什么时候不?

awk 什么时候将换行符视为“;”,什么时候不?

我正在阅读著名的 awk 教程http://www.grymoire.com/Unix/Awk.html

其中提到了To be precise, in the original AWK you can insert a new line character after the curly braces, and at the end of a command, but not elsewhere.

awk我在我的 mac 和远程主机上使用和进行了以下多行 awk 命令测试gawk

  awk '$0 !~ /special_signal/  \
       { my_dict[$1] += $2 }
       END { for (uid in my_dict)   \
             if (my_dict[uid] > 1)  \
             print uid, my_dict[uid]}' raw_data | sort -nk2

上述 awk 代码的原始一行 awk 命令是:

awk '$0 !~ /special_signal/ { my_dict[$1] += $2 } END { for (uid in my_dict) if (my_dict[uid] > 1) print uid, my_dict[uid]}' raw_data | sort -nk2

通过我的实验。我发现在 和 上awkgawk第一个\是必不可少的,如果没有它,代码的行为将与原始的单行代码不同。换行符的效果与;

但是这两个 awk 版本中的第二个和第三个都是不必要\的。for (uid in my_dict)if (my_dict[uid] > 1)

我删除了它们,多个代码的作用与单行代码完全相同。

然后我将第二个和第三个替换\;,这会导致多行代码产生错误的结果。

for (uid in my_dict)这进一步证明,如果我在 after和后添加换行符if (my_dict[uid] > 1),它们只会将这两个代码块与下一行的代码连接起来,就像\.

我的结论似乎与教程相冲突。

那么,实际上,在什么情况下 awk 会将换行符视为;以及在什么情况下将其视为\


PS:为了测试,我做了一些测试内容raw_data

Tom 2
Tom 5
Jack 3
Mary 5
special_signal 5
Tim 10
Don 22
Jan 3
Jack 8
special_signal 10

答案1

示例行之间的区别是:命令可以在此时完成吗?一个模式可以独立存在;{print}假设在这种情况下。下一行被视为第二条命令(不是第一条命令的第二部分);假设该模式始终为真。

但在控制结构 ( for, if) 中,您无法在该点完成命令,因此很明显该命令将在下一行继续。

shell 代码中类似:

echo foo &&
echo bar

的解释不同于

echo foo
&& echo bar

所以你需要

echo foo \
&& echo bar

与此不同的是awk,只有一种方法有效。但类似的情况也可能存在。

相关内容