用 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
我似乎无法弄清楚如何用 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