Awk 大括号后面的数字是什么?

Awk 大括号后面的数字是什么?,awk,Awk,为什么 echo foo bar..baz bork | awk 'BEGIN{RS=".."} {gsub(OFS,"\t");}1' 似乎做了和你一样的事 echo foo bar..baz bork | awk 'BEGIN{RS=".."} {gsub(OFS,"\t");} {print;}' ? 事实上,任何不是零的数字(包括小数和负数)都会做同样的事情。但是,如果省略数字、使用文本字符或使用零,则不会打印任何内容。我在任何地方都没有看到这个文档,尽管我可能遗漏了一些东西。如果您

为什么

echo foo bar..baz bork | awk 'BEGIN{RS=".."} {gsub(OFS,"\t");}1'
似乎做了和你一样的事

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


事实上,任何不是零的数字(包括小数和负数)都会做同样的事情。但是,如果省略数字、使用文本字符或使用零,则不会打印任何内容。我在任何地方都没有看到这个文档,尽管我可能遗漏了一些东西。

如果您还记得的话,
awk
是一种具有一系列操作的语言。对每一行(至少在概念上)计算每个模式,当模式匹配时,执行操作。模式或动作都可以省略。省略的模式匹配每一行;省略的操作默认为
{print$0}
(也称为
{print}
)。“模式”可能是一个简单的正则表达式匹配,或其他更复杂的一般条件,如果要执行操作,则必须将其求值为true(如his中所述)


在您的示例中,
1
是一种模式;它的评估结果是正确的。未指定该操作,因此将调用默认操作,即
{print}
{print$0}
。除零或空字符串以外的任何值的计算结果均为true,并将调用打印。(请注意,如果您提到一个未初始化的变量(例如,
c
),那么它将被自动创建并设置为零,因此计算结果为false。因此
awk'c'我真的不喜欢这些类型的快捷方式,因为它混淆和误导了它的解析方式。正如您所说

awk 'BEGIN{RS=".."} {gsub(OFS,"\t");}1'
似乎相当于

awk 'BEGIN{RS=".."} {gsub(OFS,"\t");} {print;}'
这似乎意味着
1
只是
{print}
的别名。但事实并非如此。
1
与前面的括号没有关联。它实际上是第二个语句的一部分,没有
操作
,因此它使用
{print}的默认
操作
。你可以这样想

awk 'BEGIN{RS=".."} {gsub(OFS,"\t")}; 1!=0 {print}'
下面是一个示例,我认为它更好地演示了
awk
使用的
condition{action}
格式:

echo 'a b c' | awk '1 {print $1}; 2 {print $2}; 0 {print $3}'

a
b
之所以打印,是因为
1
2
非零,且计算结果为
true
c
之所以不打印,是因为
0
计算结果为
false

是有意义的。不知何故,我认为AWK是在分析它,作为先前行动声明的一部分,有点像
d
那样>在sed中使用。您可能会注意到,示例中的所有分号都是有效的,但都是多余的。我知道大多数教科书都将其称为
模式
,但我认为将其称为
条件
更有意义,因为这才是它真正的含义。我相信有一个模式是1970年代awk的初衷,但这是这是很久很久以前的事了……任何数字都会像
5
2345
甚至负数一样工作
-54
,但大多数使用
1
省略的动作默认为
{print$0}
(又名
{print}
),但省略
1
不工作为什么?似乎
1
不等于
{print;}
。尽管如此,
1
{print;}
的输出是相同的。这确实令人困惑,你能解释一下吗?你可以缩短一些代码:
awk'-vrs=“…”{gsub(OFS,“\t”)}1'
或者把变量放在code
awk'{gsub(OFS,\t”)}1'RS=“…