为什么
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模式相关的操作.
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)
a和b被打印,因为1和2不为零并且计算结果为true。c不打印,因为0计算结果为false.