我已经通过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
答案 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 }
子句之外,我的修改只是为了让它自包含并且不会改变任何流控制或逻辑。
您能否找到并发布几行失败的实际数据,因为提供的虚拟数据似乎可以正常工作?