使用AWK
,我需要避免在特定字段中使用特定单词的打印行...
在有人称之为重复之前,我进行了搜索,并发现了这个:Match string not containg a certain phrase,但我认为这是其他背景,因为我需要在特定列中进行匹配。
鉴于数据:
ABC ABC
DEF AAA
GHI ABC
我想过滤以仅在第一个字段(第2行和第3行)中使用不包含ABC的文本来打印整行。
首次尝试时,我尝试了(?!...)
,并期望以这种方式返回DEF
和GHI
:
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
无论如何,这看起来对我来说是一种解决方法,我感觉我没有以正确的方式做事。
有人知道更好的方法,或至少解释为什么第一次和第二次尝试都不起作用?
答案 0 :(得分:2)
您可以使用以下习语:
awk '$1 !~ /ABC/' file
如果第一个字段不包含ABC
,则会打印该行。 (匹配运算符为!~
)。请注意,该命令仅包含条件而不包含print
操作。这可以起作用,因为awk
中的默认操作是print
,因此无需明确指定。
答案 1 :(得分:0)
此awk
应该:
awk '!/^ABC/' file
DEF AAA
GHI ABC
它将打印不是(!
)的行(^
)与ABC