如何打印特殊字符串?

如何打印特殊字符串?

我有一个包含以下内容的文件:

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

相关内容