如何使用awk删除第n列中包含字符串的行?

如何使用awk删除第n列中包含字符串的行?

我有一个制表符分隔的文件,如下所示:

$ cat in_file
NC_013132.1     7260299 7261429 WP_012793281.1
NC_013132.1     7270674 7270862 NC_013132.1     7270674 7270862 ID=cds5678
NC_013132.1     7573559 7574311 WP_012793549.1
NZ_CP022095.2   2809552 2809629 NZ_CP022095.2   2809552 2809629 ID=cds2731
NZ_CP022095.2   2884046 2885668 WP_003877393.1
NZ_CP022095.2   3106358 3106435 NZ_CP022095.2   3106358 3106435 ID=cds2976

我想删除以第 4 列NC或开头的行NZ。我尝试使用 执行此操作,awk -F '\t' '$4 != "^NC | ^NZ"' in_file但没有成功。

输出应如下所示:

$ cat out_file
NC_013132.1     7260299 7261429 WP_012793281.1
NC_013132.1     7573559 7574311 WP_012793549.1
NZ_CP022095.2   2884046 2885668 WP_003877393.1

答案1

您可以简单地按如下所示执行此操作。当您使用awkwith时==,您正在执行相等的文字字符串匹配,其中您不能执行诸如^or 之类的正则表达式匹配$。您可以简单地进行模式匹配~并使用 开启否定匹配!。对于多种模式,请使用(pat1|pat2)ERE 支持的交替样式

awk 'BEGIN { OFS=FS="\t" } $4 !~ /^(NZ|NC)/' file

在命令末尾添加重定向以将输出写入新文件> newfile。要就地修改文件,请按照此答案中的步骤操作如何使用 awk 永久更改文件? (“就地”编辑,与“sed -i”一样)

答案2

您需要模式匹配运算符~(或!~用于否定),将右侧操作数视为(扩展)正则表达式,将左侧操作数视为字符串,因此

awk -F'\t' '$4 !~ "^(NC|NZ)"' infile

或者更短:

awk -F'\t' '$4 !~ "^N[CZ]"' infile

如果列中没有空格,则更短(因为默认的awkFS 是制表符/空格):

awk '$4 !~ "^N[CZ]"' infile

答案3

尝试过以下方法

命令

awk '$4 !~ /^NC|^NZ/{print $0}' filename

输出

awk '$4 !~ /^NC|^NZ/{print $0}' o.txt
NC_013132.1     7260299 7261429 WP_012793281.1
NC_013132.1     7573559 7574311 WP_012793549.1
NZ_CP022095.2   2884046 2885668 WP_003877393.1

相关内容