awk行不匹配

时间:2015-03-17 00:12:15

标签: regex bash awk

使用AWK,我需要避免在特定字段中使用特定单词的打印行... 在有人称之为重复之前,我进行了搜索,并发现了这个:Match string not containg a certain phrase,但我认为这是其他背景,因为我需要在特定列中进行匹配。

鉴于数据:

ABC      ABC
DEF      AAA
GHI      ABC

我想过滤以仅在第一个字段(第2行和第3行)中使用不包含ABC的文本来打印整行。

首次尝试时,我尝试了(?!...),并期望以这种方式返回DEFGHI

echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '$1 ~ /(?!ABC)/ {print}'

但什么都不返回。

第二次尝试......在表达式!/.../

之前使用
~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '$1 ~ !/ABC/ {print}'

也没有回报。

我不明白为什么......

所以另一个镜头失败了(正如预期的那样):

~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '!/ABC/ {print}'
DEF     AAA

正如预期的那样,第二个字段也被过滤了。所以,它似乎只适用于$0

然后我完成了我的作业并以这种方式工作:

~$ echo -e "ABC\tABC\nDEF\tAAA\nGHI\tABC" | awk '{FL=$0;$0=$1}; !/ABC/ {print FL}; { $0=FL }'
DEF     AAA
GHI     ABC

无论如何,这看起来对我来说是一种解决方法,我感觉我没有以正确的方式做事。

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

2 个答案:

答案 0 :(得分:2)

您可以使用以下习语:

awk '$1 !~ /ABC/' file

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

答案 1 :(得分:0)

awk应该:

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

它将打印不是(!)的行(^)与ABC