从非标准格式的文本文件中提取核苷酸序列

时间:2013-05-28 08:45:22

标签: regex perl

我已经通过word文档中的合作者给出了一些DNA序列,我希望将其转换为一个文件中的一系列fasta序列。

我把它变成了一个文本文件,我想用正则表达式来提取基因名称和序列:

use warnings;
use strict;

die "usage: make_fasta.pl <sequence file>" unless (@ARGV == 1);

my $seq_filename    = shift;
my $fasta_db_name   = $seq_filename . "_db.fa";

open(my $seq_file, '<', $seq_filename) 
          or die "can't open file $seq_filename, $!";
open(my $fasta_file, '>', $fasta_db_name) 
          or die "can't open file $fasta_db_name, $!";

while (my $line = <$seq_file>) {
    chomp $line;
    if ($line =~ /^[ATCG]+$/) { # if the line is entirely DNA seqence
       print $fasta_file "$line\n";            

    } elsif ($line =~ /Full-length (\w+) cDNA/) { # if the line has gene info
        print $fasta_file ">$1\n";

    } else {
        next;

    } 
}

但那只是给了我第一个基因的名字。显然我对DNA正则表达式做错了,但我不能为我的生活做出努力。在我看来,这与我在本网站和其他网站上发现的其他建议的DNA测试完全相同。

我正在尝试解析的文件配置如下:

Collaborators name

title of gene set

Full-length clock cDNA coding sequence 

ATGGTAGGATGTGTAATGCGTACGTGATCGT

Full-length per cDNA coding sequence

ATGCTAGCTACGTACGTAGCTACGTAGTACG

我希望输出为fasta文件,所以:

>clock
ATGGTAGGATGTGTAATGCGTACGTGATCGT
>per
ATGCTAGCTACGTACGTAGCTACGTAGTACG

实际输入文件的前几行是:

Dr Lin Zhang (Leicester University 10/2012) 

Canonical clock genes 

Full-length per cDNA coding seq (3693bp) 

ATGGACACAGGAACACCCCATGAAGATGTGCCCTCAGAGGACCACACCTTGGAAGAAGGGGACAGCAAGAACCCCTCGTGCCAGCAAGAGTCAGCCTACGGCTCCCTCGAGTCATCCTCCAATGGACAGTCTCAGAAAAGTTTCGGAGGAAGTGGAAGCAAAAGCTTAAATAGTGGTTCGAGTCACAGCAGCGGCTTTGGGGACCAAAATGATTTCAAGGGTATCCATCTTCACGAAGCGAAACACATAGCGTTGAAGAAGAAGAAAACTGGGAAAGGAGGTGAAAAGGTAGCAGAAATCCCCTTTCAAACTGCCTCTGAGGCAGAACTGTCCTCCAAAGGAAACGAAACAGAAAAGGAGAAAGAAACAAGCCTCGAGGAGTCTCCTGCTGCAAAAGAGGAAGCAATTATCGAAAAGGAGTCTCGTTACATCCACCCGAGGAACT

2 个答案:

答案 0 :(得分:1)

如果没有看到实际输入文件的一部分,很难回答这个问题。

您的示例输入与REGEX之间存在不匹配:

# looking for verbatim('Full-length') then <space> then one WORD_WITH_ALPHNUMERICS  then <space> and then verbatim 'cDNA'
$line =~ /Full-length (\w+) cDNA/;

您的示例输入行的“全长”没有短划线,基因名称的多个单词不仅仅是一个,而且最后没有“cDNA”。

如果您的输入行具有'全长基因名称,包含多个单词 cDNA',则您的REGEX可以是:

$line=~/Full-length\s+(.*?)\s+cDNA/;

答案 1 :(得分:0)

问题显然在于输入数据。我修改了您发布的代码以生成以下程序:

#!/usr/bin/env perl    

use warnings;
use strict;

while (my $line = <DATA>) {
    chomp $line;
    if ($line =~ /^[ATCG]+$/) { # if the line is entirely DNA seqence
       print "$line\n";            
    } elsif ($line =~ /Full-length (\w+) cDNA/) { # if the line has gene info
        print ">$1\n";
    } 
}


__DATA__
Collaborators name

title of gene set

Full-length clock cDNA coding sequence 

ATGGTAGGATGTGTAATGCGTACGTGATCGT

Full-length per cDNA coding sequence

ATGCTAGCTACGTACGTAGCTACGTAGTACG

并生成您指定的输出:

~$ src/tmp/cdna 
>clock
ATGGTAGGATGTGTAATGCGTACGTGATCGT
>per
ATGCTAGCTACGTACGTAGCTACGTAGTACG

除了删除无用的else { next }子句之外,我的修改只是为了让它自包含并且不会改变任何流控制或逻辑。

您能否找到并发布几行失败的实际数据,因为提供的虚拟数据似乎可以正常工作?