我有一个包含以下内容的文件:
NC_014378.1 Protein Homology CDS 192004 192117 . + 0 ID=cds185;Parent=gene211;Dbxref=Genbank:WP_013277182.1;Name=WP_013277182.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_005487032.1;product=50S ribosomal protein L36;protein_id=WP_013277182.1;transl_table=11
NC_014378.1 Protein Homology CDS 1753871 1754437 . + 0 ID=cds1636;Parent=gene1718;Dbxref=Genbank;Name=NP_013278608.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:NP_013278608.1;product=hypothetical protein;protein_id=NP_013278608.1;transl_table=11
NC_014378.1 Protein Homology CDS 233759 235705 . + 0 ID=cds226;Parent=gene252;Dbxref=Genbank;Name=RCSM;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:YP_013277222.1;product=methyl-accepting chemotaxis;transl_table=11
NC_014378.1 Protein Homology CDS 486732 488687 . + 0 ID=cds446;Parent=gene486;Dbxref=Genbank:WP_013277438.1;Name=WP_013277438.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_013277438.1;product=methyl-accepting chemotaxis protein;protein_id=WP_013277438.1;transl_table=11
我想获得以下输出
192004 192117 + WP_013277182.1
1753871 1754437 + NP_013278608.1
233759 235705 + YP_013277222.1
486732 488687 + WP_013277438.1
将使用哪个 unix 命令。
答案1
使用 Perl:
perl -naE 'say "$F[4] $F[5] $F[7] ", /([NWY]P_.*?);/'
perl -naE
对于每一行,分成字段并......say "$F[4] $F[5] $F[7] ", /([NWY]P_.*?);/
...并打印 4、5、7 和正则表达式
答案2
使用 GNU awk
:
awk '{print $5,$6,$8,gensub(/.*([NWY]P_[^;]+).*/,"\\1",1)}'
这将打印(以空格分隔的)字段 5、6、8 和以“N”、“W”或“Y”开头、后跟“P_”的第一个字符串,直到当前行的下一个分号。
如果你想要一个不同的哦输出F领域年代eparator,更改 BEGIN 块中的 OFS 变量,例如对于两个空格使用:
awk 'BEGIN{OFS=" "}{print $5,$6,$8,gensub(/.*([NWY]P_[^;]+).*/,"\\1",1)}'
如果您想要对齐制表OFS="\t"
符分隔列的值,这是一个不错的选择。
如果您不能使用 GNU,awk
您可以使用match()
和substr()
函数来替换gensub()
:
awk 'match($0,/[NWY]P_[^;]+/){print $5,$6,$8,substr($0,RSTART,RLENGTH)}'
解释
print $5,$6,$8
– 打印由 OFS 分隔的这些字段gensub(/.*([NWY]P_[^;]+).*/,"\\1",1)
– 在(默认)整个当前行上,.*([NWY]P_[^;]+).*
用组 1()中保存的内容替换"\\1"
一次。.*([NWY]P_[^;]+).*
匹配将由“N”、“W”或“Y”后跟“P_”以及至少一个非“;”的字符组成的第一个字符串的整行保存[^;]+
为一个组(,因为正则表达式是贪婪的,所以这会匹配直到第一个分号的所有内容)。match($0,/[NWY]P_[^;]+/)
– 搜索$0
(= 整行)以查找[NWY]P_[^;]+
(参见上文)的第一个匹配项,并将RSTART
变量设置为其索引,将RLENGTH
变量设置为其字符数。substr($0,RSTART,RLENGTH)
– 从 中$0
提取从 index 开始的RSTART
长度为RLENGTH
示例运行
$ cat YP
NC_014378.1 Protein Homology CDS 192004 192117 . + 0 ID=cds185;Parent=gene211;Dbxref=Genbank:WP_013277182.1;Name=WP_013277182.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_005487032.1;product=50S ribosomal protein L36;protein_id=WP_013277182.1;transl_table=11
NC_014378.1 Protein Homology CDS 1753871 1754437 . + 0 ID=cds1636;Parent=gene1718;Dbxref=Genbank;Name=NP_013278608.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:NP_013278608.1;product=hypothetical protein;protein_id=NP_013278608.1;transl_table=11
NC_014378.1 Protein Homology CDS 233759 235705 . + 0 ID=cds226;Parent=gene252;Dbxref=Genbank;Name=RCSM;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:YP_013277222.1;product=methyl-accepting chemotaxis;transl_table=11
NC_014378.1 Protein Homology CDS 486732 488687 . + 0 ID=cds446;Parent=gene486;Dbxref=Genbank:WP_013277438.1;Name=WP_013277438.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_013277438.1;product=methyl-accepting chemotaxis protein;protein_id=WP_013277438.1;transl_table=11
$ <YP awk '{print $5,$6,$8,gensub(/.*([NWY]P_[^;]+).*/,"\\1",1)}'
192004 192117 + WP_013277182.1
1753871 1754437 + NP_013278608.1
233759 235705 + YP_013277222.1
486732 488687 + WP_013277438.1
答案3
和sed
:
sed -E 's/.*CDS //;s/ *\. //;s/ 0.*([NWY]P_[^;]+).*/\1/'
解释
s/.*CDS //
–s
将字符串“CDS”及其之前的所有内容(在当前处理的行上)替换为空 – 这将删除行的开头s/ *\. //
– 将零个或多个空格后跟点,再跟空格替换为空 – 这将删除点列及其空格字符s/ 0.*([NWY]P_[^;]+).*/\1/
– 用“ 0”替换,后跟零个或多个字符,用字符串“N”、“W”或“Y”替换,后跟“P_”,后跟至少一个非分号的字符(将此字符串保存在一个组中),后跟保存的字符串的零个或多个字符 – 这将获取行尾,提取第一个 WP 字符串并删除其他所有内容
示例运行
$ <YP sed -E 's/.*CDS //;s/ *\. //;s/ 0.*([NWY]P_[^;]+).*/\1/'
192004 192117 + WP_013277182.1
1753871 1754437 + NP_013278608.1
233759 235705 + YP_013277222.1
486732 488687 + WP_013277438.1