解析GenBank文件:get location tag vs produ

2024-07-01 07:00:21 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,GenBank文件由基因条目组成(由“gene”声明,然后是相应的“CDS”条目(每个基因只有一个条目),就像下面我展示的两个条目一样。我想在一个以制表符分隔的两列文件中获取location_tag vs product“gene”和“CDS”前面和后面总是有空格。在

A previous question suggested a script.

问题是,似乎因为“product”的名称中有时有“/”字符,它与此脚本有冲突,据我所知,是使用“/”作为字段分隔符来存储数组中的信息?在

我想解决这个问题,要么修改这个脚本,要么构建另一个脚本。在

perl -nE'
  BEGIN{ ($/, $") = ("CDS", "\t") }
  say "@r[0,1]" if @r= m!/(?:locus_tag|product)="(.+?)"!g and @r>1
' file


 gene            complement(8972..9094)
                 /locus_tag="HAPS_0004"
                 /db_xref="GeneID:7278619"
 CDS             complement(8972..9094)
                 /locus_tag="HAPS_0004"
                 /codon_start=1
                 /transl_table=11
                 /product="hypothetical protein"
                 /protein_id="YP_002474657.1"
                 /db_xref="GI:219870282"
                 /db_xref="GeneID:7278619"
                 /translation="MYYKALAHFLPTLSTMQNILSKSPLSLDFRLLFLAFIDKR"
 gene            68..637
                 /locus_tag="HPNK_00040"
 CDS             68..637
                 /locus_tag="HPNK_00040"
                 /codon_start=1
                 /transl_table=11
                 /product="NinG recombination protein/bacteriophage lambda
                 NinG family protein"
                 /protein_id="CRESA:HPNK_00040"
                 /translation="MIKPKVKKRKCKCCGGEFKSADSFRKWCSAECGVKLAKIAQEKA
                 RQKAIEKRNREERAKIKATRERLKSRSEWLKDAQAIFNEYIRLRDKDEPCISCRRFHQ
                 GQYHAGHYRTVKAMPELRFNEDNVHKQCSACNNHLSGNITEYRINLVRKIGAERVEAL
                 ESYHPPVKWSVEDCKEIIKTYRAKIKELK"

Tags: 文件脚本dbtag基因条目productgene
2条回答

{geni在网上找到了一个样本文件}不完整。在

使用这段代码和^{}模块,对它进行解析,猜测您要查找的是结构的哪些部分。在本例中,包含locus_tag字段和product字段的“特性”。在

use strict;
use warnings;
use feature 'say';
use Bio::GenBankParser;

my $file = shift;
my $parser = Bio::GenBankParser->new( file => $file );
while ( my $seq = $parser->next_seq ) {
    my $feat = $seq->{'FEATURES'};
    for my $f (@$feat) {
        my $tag = $f->{'feature'}{'locus_tag'};
        my $prod = $f->{'feature'}{'product'};
        if (defined $tag and defined $prod) {
            say join "\t", $tag, $prod;
        }
    }
}

用法:

^{pr2}$

输出:

MG_001  DNA polymerase III, beta subunit
MG_470  CobQ/CobB/MinD/ParA nucleotide binding domain-containing protein

同一输入的一个行程序的输出将是:

MG_001  DNA polymerase III, beta subunit
MG_470  CobQ/CobB/MinD/ParA nucleotide binding
                     domain-containing protein

当然,假设您将/s修饰符添加到regex中以说明多行条目(这是leeduhem在注释中指出的):

m!/(?:locus_tag|product)="(.+?)"!sg
#                                ^   this

读过你重复的问题http://www.biostars.org/p/94164/(请不要像这样重复发帖),下面是一个最小的Biopython答案:

import sys
from Bio import SeqIO
filename = sys.argv[1] # Takes first command line argument input filename
for record in SeqIO.parse(filename, "genbank"):
    for feature in record.features:
        if feature.type == "CDS":
            locus_tag = feature.qualifiers.get("locus_tag", ["???"])[0]
            product = feature.qualifiers.get("product", ["???"])[0]
            print("%s\t%s" % (locus_tag, product))

只需稍作修改,您就可以将其写入文件。在

相关问题 更多 >

    热门问题