Perl 如何从文本文件中提取DNA序列而不逐行读取?
我试图从一个文本文件中提取一个DNA序列并保存它。我可以使用下面的代码来完成,但这不是最好的方法,因为我正在逐行读取文本文件。我想知道是否有一种更简单的方法可以在我的文本文件中找到每个DNA序列,而不用逐行读取文本文件 example.plPerl 如何从文本文件中提取DNA序列而不逐行读取?,perl,file,input,dna-sequence,Perl,File,Input,Dna Sequence,我试图从一个文本文件中提取一个DNA序列并保存它。我可以使用下面的代码来完成,但这不是最好的方法,因为我正在逐行读取文本文件。我想知道是否有一种更简单的方法可以在我的文本文件中找到每个DNA序列,而不用逐行读取文本文件 example.pl #!/usr/local/bin/perl open(MYFILE, 'data.txt'); @entire_file = <MYFILE>; while (<MYFILE>) { chomp; print "$_\
#!/usr/local/bin/perl
open(MYFILE, 'data.txt');
@entire_file = <MYFILE>;
while (<MYFILE>) {
chomp;
print "$_\n";
}
$line1 = <MYFILE>;
chomp $line1;
$line2 = <MYFILE>;
chomp $line2;
$line3 = <MYFILE>;
chomp $line3;
$line4 = <MYFILE>;
chomp $line4;
$line5 = <MYFILE>;
chomp $line5;
#Prints DNA sequence 1
print "$line2";
#Prints DNA sequence 2
print "$line5";
close(MYFILE);
#/usr/local/bin/perl
打开(MYFILE,'data.txt');
@整个_文件=;
而(){
咀嚼;
打印“$\u\n”;
}
$line1=;
chomp$line1;
$line2=;
chomp$line2;
$line3=;
chomp$line3;
$line4=;
chomp$line4;
$line5=;
chomp$line5;
#打印DNA序列1
打印“$line2”;
#打印DNA序列2
打印“$line5”;
关闭(MYFILE);
data.txt
gi | 171361,酿酒酵母,(CYS3)基因,实验室1,Joe Bloggs
GCAGCGAGACAGCTGCCTCTCTCCGCGAGCCCCGTGGCAGAGAGACCTCTTGCGAAGACATCGAGTACC
gi | 171362,酿酒酵母,(CYS4)基因,实验室2,保罗·麦克唐纳
GAAGCGACGACGCTGTGCTATCCCCGGCGAGCGAGCCGCGTGGCGAGGACCTCTTGCGAAGCATCCGAGTACC
之后
我建议您通读文件、模式匹配和循环的相关知识。如果您的所有文件行都在一个数组中,您可以使用正则表达式在该数组上迭代以获取id/描述符和序列元素:
use Modern::Perl;
use Data::Dumper;
my ( @id, @des, @dna );
chomp( my @FASTA = <DATA> );
for ( my $i = 0 ; $i < @FASTA ; $i += 3 ) {
my ( $id, $des ) = split ', ', $FASTA[$i], 2;
push @id, $id;
push @des, $des;
push @dna, $FASTA[ $i + 1 ];
}
say Dumper \@id, \@des, \@dna;
say @FASTA + 0;
__DATA__
>gi|171361, Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs
GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC
>gi|171362, Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald
GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC
下面是一个使用的模块Bio::SeqIO的示例
#!/usr/bin/perl
use strict;
use warnings;
use Bio::SeqIO;
my $in = Bio::SeqIO->new( -file => "junk.txt" ,
-format => 'FASTA');
while ( my $seq = $in->next_seq() ) {
printf "id: %s\ndescr: %s\nseq: %s\n\n", $seq->id, $seq->desc, $seq->seq;
}
__END__
Contents of junk.txt
>gi|171361, Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs
GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCG
CTTGCGAAAGCATCGAGTACC
>gi|171362, Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald
GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCG
CTTGCGAAAGCATCGAGTACC
下面是运行ptogram的结果
C:\Old_Data\perlp>perl t5.pl
id: gi|171361,
descr: Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs
seq: GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC
id: gi|171362,
descr: Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald
seq: GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC
如果您只需要命令行中的序列,则此一行程序可以:
perl -lane 'print $F[-1] if @F' data.txt
有关详细信息,请参见第(1)部分的
使用awk的类似解决方案
:
awk 'NF { print $NF }' data.txt
您希望如何读取它?这不应该起作用,因为您正在读取整个文件,然后试图读取更多数据。你应该在循环后处理整个文件,而不是处理模式匹配。我已经读过模式匹配的相关知识,只是不知道如何处理。这么多的符号。我希望能够识别像DNA序列GATC…等模式并存储它,而不必读取文本文件中的每一行。如果你能帮忙,请。谢谢。:)我在做一个问题,第一部分说提取包含两个FASTA格式文件的txt文件的内容,tats为什么@整个文件都在那里。然后说提取描述符行,这是用$行,然后每个DNA序列,我可以做,它不是一个伟大的方式来做它,这就是为什么我张贴问题。你知道在MYFILE的描述符行的位置吗?考虑添加<代码>下一个,除非$线= ~/\s//;
在跳过条件so空行之前,否则它们将显示为序列。另外,FASTA行实际上以>开头,但当前格式没有显示这些字符,因此需要使用$line=~/^>gi/
。感谢您的帮助和反馈。我会的。:)使用Bio::SeqIO
模块是一个很好的解决方案,因此+1。我已经更新了我的以显示id。我建议使用bio perl。但你也可以试试
C:\Old_Data\perlp>perl t5.pl
id: gi|171361,
descr: Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs
seq: GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC
id: gi|171362,
descr: Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald
seq: GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC
perl -lane 'print $F[-1] if @F' data.txt
awk 'NF { print $NF }' data.txt