用 awk 否定条件

Negate condition with awk

我似乎无法弄清楚如何用 awk 否定我的条件。

例如,假设我有

g ha
a bb
g hc
f cd
t de
g pf

我可以只打印带有 g 并以 h 开头的第一列和第二列:

cat test.txt | awk ' ~ /g/ &&  ~ /^h/'

但是我如何做相反的事情,我只想打印那些不是 g 的,并从 h 开始。基本上有输出:

a bb
f cd
t de
g pf

如果 ~ /g/ && ~ /h/为真则继续下一行,否则输出当前行。

awk ' ~ /g/ &&  ~ /h/{next} {print}' test.txt

输出:

a b
f c
t d
g p

您也可以使用 !

否定整个匹配

由于第一个字段始终是单个字符,您可以检查它是否是 g 而无需使用正则表达式符号,因为如果 g字符串。

awk '!( == "g" &&  ~ /^h/)' test.txt

输出

a bb
f cd
t de
g pf

~ /g/ && ~ /^h/ 或任何其他条件的否定(相反)只是简单地将 ! 粘贴在它的前面:

$ awk '!( ~ /g/ &&  ~ /^h/)' file
a bb
f cd
t de
g pf

但您也可以将布尔代数应用于 (!(a && b) = !a || !b) 以获得:

$ awk ' !~ /g/ ||  !~ /^h/' file
a bb
f cd
t de
g pf