我正在阅读著名的 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
通过我的实验。我发现在 和 上awk
,gawk
第一个\
是必不可少的,如果没有它,代码的行为将与原始的单行代码不同。换行符的效果与;
但是这两个 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
,只有一种方法有效。但类似的情况也可能存在。