[Archlinux 上的 GNU awk v4.2.1]
将 cli 的默认打印操作抑制awk
到标准输出很容易,并且在 UL 上有详细记录,例如这里。从脚本中这样做让我很头疼。这是玩具脚本:
#!/usr/bin/awk -f
BEGIN {FS=","}
FNR > 1 # skip header
{
if ( $1 == $2 ) {
if ( NR == 4 ) {
printf("*** Print NR=4 ok. \n")
} else {
print > "/dev/null" # print nothing
}
} else {
printf("=== Fields 1 and 2 not equal (NR=%s). \n",NR)
}
}
和玩具数据:
col1 col2
1,3
2,2
aa,aa
3.01,-353.01
4.1,4.1
101,101
hello, hello
asd,koi0
连同预期/期望的输出:
=== Fields 1 and 2 not equal (NR=2).
*** Print NR=4 ok.
=== Fields 1 and 2 not equal (NR=5).
=== Fields 1 and 2 not equal (NR=8).
=== Fields 1 and 2 not equal (NR=9).
相反,我得到:
=== Fields 1 and 2 not equal (NR=1).
1,3
=== Fields 1 and 2 not equal (NR=2).
2,2
aa,aa
*** Print NR=4 ok.
3.01,-353.01
=== Fields 1 and 2 not equal (NR=5).
4.1,4.1
101,101
hello, hello
=== Fields 1 and 2 not equal (NR=8).
asd,koi0
=== Fields 1 and 2 not equal (NR=9).
为了抑制输出到标准输出,我尝试使用:
getline
, {}
, next
,printf("")
甚至是古怪的ORS=""; print ""; ORS="\n"
而不是print > "/dev/null"
. 我显然在那个该死的脚本中做错了什么,找不到什么......
唯一的错误是
应该是
带有条件的代码块必须与条件在同一行开始。
您的原始脚本实际上首先要做的是
这将打印从第二行开始的所有行(当条件没有关联的代码块时,默认操作是在条件为真时打印当前记录,就好像该块是
{ print }
)。然后它将后面的块应用于每一行(因为该块没有关联的条件)。
这不是 GNU 的特性
awk
。所有awk
的实现都应该是这样的。至于脚本的其他部分:
这可以删除,离开
或者,