Regex awk线不匹配

Regex awk线不匹配,regex,bash,awk,Regex,Bash,Awk,使用AWK,我需要避免在特定字段中打印带有特定单词的行。。。 在有人调用它是重复的之前,我做了搜索,发现了这个:,但我认为它是另一个上下文,因为这里我需要在特定列中匹配 鉴于数据: ABC ABC DEF AAA GHI ABC 我想过滤,只打印第一个字段(第2行和第3行)中不包含ABC的全文 作为第一次尝试,我尝试了(?!…),希望通过这种方式返回DEF和GHI: echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '$1

使用
AWK
,我需要避免在特定字段中打印带有特定单词的行。。。 在有人调用它是重复的之前,我做了搜索,发现了这个:,但我认为它是另一个上下文,因为这里我需要在特定列中匹配

鉴于数据:

ABC      ABC
DEF      AAA
GHI      ABC
我想过滤,只打印第一个字段(第2行和第3行)中不包含ABC的全文

作为第一次尝试,我尝试了
(?!…)
,希望通过这种方式返回
DEF
GHI

echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '$1 ~ /(?!ABC)/ {print}'
但什么也不归还

第二次尝试。。。在表达式
!/…之前使用not/

~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '$1 ~ !/ABC/ {print}'
什么也不归还

我不明白为什么

因此,另一次射击失败(正如这次预期的那样):

正如这次所料,第二个字段也被过滤了。因此,它似乎只适用于
$0

然后我做了家庭作业,让它这样工作:

~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '{FL=$0;$0=$1}; !/ABC/ {print FL}; { $0=FL }'
DEF     AAA
GHI     ABC
无论如何,这对我来说似乎是一个解决办法,我有一种不好的感觉,我没有以正确的方式做


有人知道一个更好的方法,或者至少解释为什么第一次和第二次尝试不起作用?

您可以使用以下习惯用法:

awk '$1 !~ /ABC/' file

如果第一个字段不包含
ABC
,则打印该行。(匹配not运算符为
!~
)。请注意,该命令仅包含一个条件,不包含
print
操作。这可以工作,因为
awk
中的默认操作是
print
,因此不需要明确指定。

awk
应执行以下操作:

awk '!/^ABC/' file
DEF      AAA
GHI      ABC

它不会(
)以
ABC

开始(
^
)打印行。谢谢,您的回答给了我另一种方式,请记录:
echo-e“ABC\tABC\nDEF\tAAA\nGHI\tABC”| awk'!($1~/ABC/){print}'DEF AAA GHI ABC
就像我说的,在这种情况下可以省略
{print}
。好的,在示例中我使用了第一个字段,但问题是关于任何字段的。
awk '!/^ABC/' file
DEF      AAA
GHI      ABC