Pregunta

Básicamente, un GenBank archivo consta en el gen entradas (anunciado por el 'gen' seguido de su correspondiente 'CDS' de entrada (sólo uno por cada gen) como los dos que muestro aquí abajo.Me gustaría obtener locus_tag vs producto en un delimitado por dos columnas de archivo.'gen' y 'CD' siempre están precedidas y seguidas por espacios.

Una pregunta anterior sugiere una secuencia de comandos.

El problema es que parece que porque el "producto" en ocasiones tiene un carácter '/' en el interior de su nombre, su tener conflictos con este script, que, tal y como yo lo entiendo, es el uso de '/' como separador de campo para almacenar información en una matriz?

Me gustaría resolver esto, ya sea modificando esta secuencia de comandos o la construcción de otro.

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"
¿Fue útil?

Solución

Como su muestra en el GenBank archivo fue incompleta, me fui en línea para encontrar un archivo de ejemplo que podría ser utilizado en un ejemplo, y me encontré con este archivo.

El uso de este código y de las Bio::GenBankParser módulo, se analiza adivinar qué partes de la estructura que fueron después.En este caso, "características" que contenían una locus_tag campo y un product campo.

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;
        }
    }
}

Uso:

perl script.pl input.txt > output.txt

Salida:

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

La salida de su one-liner para la misma entrada sería:

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

Asumiendo que usted agregue el /s modificador a la regex para dar cuenta de varias líneas de entradas (que leeduhem señaló en los comentarios):

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

Otros consejos

Having read your duplicated question http://www.biostars.org/p/94164/ (please don't double post like this), here's a minimal Biopython answer:

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))

With minor changes you can write this out to a file instead.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top