我有一个制表符分隔的文件,如下所示:
$ 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
您可以简单地按如下所示执行此操作。当您使用awk
with时==
,您正在执行相等的文字字符串匹配,其中您不能执行诸如^
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
如果列中没有空格,则更短(因为默认的awk
FS 是制表符/空格):
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