花括号后数字有什么作用?

sha*_*ker 14 awk

为什么

echo foo bar..baz bork | awk 'BEGIN{RS=".."} {gsub(OFS,"\t");}1'
Run Code Online (Sandbox Code Playgroud)

好像做同样的事情

echo foo bar..baz bork | awk 'BEGIN{RS=".."} {gsub(OFS,"\t");} {print;}'
Run Code Online (Sandbox Code Playgroud)

事实上,任何不为零的数字(包括小数和负数)都会做同样的事情.但是,不使用文本字符或使用零来删除数字.我没有在任何地方看到这个记录,虽然我可能错过了一些东西.

Jon*_*ler 20

如果你还记得,awk是一种具有一系列<pattern> <action>操作的语言.针对每一行评估每个模式(至少在概念上),并且当模式匹配时,执行该动作.可以省略模式或动作.省略的模式匹配每一行; 省略的动作默认为{print $0}(aka {print}).'模式'可能是一个简单的正则表达式匹配,或者一些其他更复杂和一般的条件,如果要执行该操作,必须将其评估为true(如Ed Morton在其评论中所述).

在你的例子中,1是一个模式; 它评估为真.未指定操作,因此将调用默认操作,即{print}{print $0}.除零或空字符串以外的任何值都将计算为true并将调用print.(注意,如果你提到一个未初始化的变量(例如c),那么它会被自动处理并设置为零,因此计算结果为false.因此不awk 'c' <<<"Hi"打印任何内容.)

当然,特别处理与BEGIN和END模式相关的操作.

  • 我知道大多数教科书都把它称为"模式",但恕我直言,把它称为"条件"更有意义,因为它就是它的真实含义.我相信有一个模式有20世纪70年代awk的原始意图,但那是很久很久以前...... (3认同)

wis*_*cky 12

我真的不喜欢这些类型的快捷方式,因为它混淆并误导了它的解析方式。像你说的,

awk 'BEGIN{RS=".."} {gsub(OFS,"\t");}1'
Run Code Online (Sandbox Code Playgroud)

似乎相当于

awk 'BEGIN{RS=".."} {gsub(OFS,"\t");} {print;}'
Run Code Online (Sandbox Code Playgroud)

这似乎暗示这1只是 的别名{print}。但事实并非如此。1与前一个括号无关。它实际上是第二条语句的一部分,该语句没有action,因此它使用默认action{print}。你可以这样想。

awk 'BEGIN{RS=".."} {gsub(OFS,"\t")}; 1!=0 {print}'
Run Code Online (Sandbox Code Playgroud)

condition {action}我认为这是一个更好地演示了所使用的格式的示例awk

echo 'a b c' | awk '1 {print $1}; 2 {print $2}; 0 {print $3}'
Run Code Online (Sandbox Code Playgroud)

ab被打印,因为12不为零并且计算结果为truec不打印,因为0计算结果为false.