awk '$2=="no"{$3="N/A"}1' file
被接受了。请注意AWK脚本末尾的1
。在评论中,答案的作者说
[1]是显示当前行的神秘方式。
我很困惑。这有什么作用?
答案 0 :(得分:31)
在awk
,
由于1
始终评估为 true ,因此会执行默认操作{print $0}
,因此会打印存储在$0
因此,awk '$2=="no"{$3="N/A"}1' file
相当于和
awk '$2=="no"{$3="N/A"} {print $0}' file
再次$0
是 print 的默认参数,所以你也可以写
awk '$2=="no"{$3="N/A"} {print}' file
实际上你也可以使用任何非零数字或任何总是评估为 true 的条件来代替 1
答案 1 :(得分:8)
文档says
在awk规则中,可以省略模式或操作,但不能同时省略。如果省略模式,则对每个输入行执行操作。如果省略该操作,则默认操作是打印与该模式匹配的所有行。
因此,它将1
视为没有操作的模式。默认操作是打印该行。
即使您有一些规则,例如
awk '
in_net {
if (/^\s+bindIp:/) {
print " bindIp: 0.0.0.0"
next
} else if (/^\s*(#.*)?$/) {
in_net = 0
}
}
/^net:/ {
in_net = 1
}
1
' /etc/mongod.conf
您仍然需要1
,因为只有在遇到没有操作的规则时才会触发默认操作。
答案 2 :(得分:2)
AWK适用于条件方法,然后是动作。因此,如果任何条件为TRUE,那么我们提到的任何行动都将被执行。
如果是1
,则意味着我们将该条件设置为TRUE,在这种情况下,我们没有提及任何要执行的操作,因此默认情况下会发生awk print
。
所以这就是我们在快捷方式中写1的原因。
答案 3 :(得分:0)
我想我会添加一个答案来解释这个简写如何在 POSIX specification for awk 方面工作:
基本描述:
<块引用>awk 程序由以下形式的对组成:
<块引用>pattern { action }
缺少操作:
<块引用>模式或动作(包括括号括起来的字符)都可以省略。 缺失模式应匹配任何输入记录,缺失动作应等效于:
<块引用>{ print }
模式说明
<块引用>模式是任何有效的表达式
表达模式的描述:
<块引用>一个表达式模式应该被评估,就好像它是一个表达式中的一个 布尔上下文。如果结果为真,则该模式应被视为 匹配,并执行相关的动作(如果有)。
布尔上下文:
<块引用>在布尔上下文中使用表达式时,如果它具有数值, 零值应被视为假,任何其他值应被视为 视为真实。否则,空字符串的字符串值应为 视为假,任何其他值都应视为真。
在 awk '$2=="no"{$3="N/A"}1'
的例子中,第一个 pair 的 pattern 是 $2=="no"
和相应的 action $3="N/A"
。这将 1
本身作为下一个“对”(没有相应操作的模式)。
代替1
,这个单独的表达式模式可以是任何数值或非空字符串,例如,
awk 9999
awk '"string"'
awk 1
简写在交互式 shell 中输入单行字符时很好。另一方面,在编写脚本时,我更喜欢使用更显式的 awk '{ print }'
使我的代码对其他人更具可维护性和可读性。