Perl 如何从文本文件中提取DNA序列而不逐行读取?

Perl 如何从文本文件中提取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 "$_\

我试图从一个文本文件中提取一个DNA序列并保存它。我可以使用下面的代码来完成,但这不是最好的方法,因为我正在逐行读取文本文件。我想知道是否有一种更简单的方法可以在我的文本文件中找到每个DNA序列,而不用逐行读取文本文件

example.pl

#!/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