我似乎不知道如何用awk否定我的条件。
例如,假设我有
g ha
a bb
g hc
f cd
t de
g pf
我可以只打印第一列和第二列的g和h开头的:
cat test.txt | awk '$1 ~ /g/ && $2 ~ /^h/'
但我如何做相反的事情,我只想打印那些不是g
的,并从h
开始。基本上要有输出:
a bb
f cd
t de
g pf
如果$1 ~ /g/ && $2 ~ /h/
为true,则继续下一行,否则输出当前行。
awk '$1 ~ /g/ && $2 ~ /h/{next} {print}' test.txt
输出:
a bf ct dg p
您也可以使用!
否定整个匹配
由于第一个字段始终是单个字符,您可以在不使用regex表示法的情况下检查它是否为g
,因为如果字符串中的某个位置有g
,$1 ~ /g/
仍然匹配。
awk '!($1 == "g" && $2 ~ /^h/)' test.txt
输出
a bb
f cd
t de
g pf
$1 ~ /g/ && $2 ~ /^h/
或任何其他条件的否定(相反(只是将!
粘贴在它的前面:
$ awk '!($1 ~ /g/ && $2 ~ /^h/)' file
a bb
f cd
t de
g pf
但你也可以将布尔代数应用于此(!(a && b)
=!a || !b
(,得到:
$ awk '$1 !~ /g/ || $2 !~ /^h/' file
a bb
f cd
t de
g pf