2012-08-14 37 views
-3

我正試圖從文本文件中提取DNA序列並將其存儲。我可以使用下面的代碼來完成它,但這不是最好的方法,因爲我正逐行閱讀文本文件。我想知道如果沒有逐行讀取文本文件,是否有更簡單的方法可以在我的文本文件中查找每個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); 

data.txt中

GI | 171361,釀酒酵母,(CYS3)基因,實驗1,喬布羅格斯 GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

GI | 171362,釀酒酵母(CYS4)基因,實驗室2,Paul McDonald GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGA GTACC

+0

你怎麼會喜歡閱讀嗎? – robbieAreBest 2012-08-14 14:29:12

+0

這應該不起作用,因爲您正在閱讀整個文件,然後搭售閱讀更多數據。在循環之後,您應該使用'@ entire_file'而不是''。 – perreal 2012-08-14 14:38:58

+0

我已經閱讀了模式匹配,只是不知道該怎麼做。那麼多符號。我希望能夠識別像DNA序列GATC等的模式並存儲它,而不必閱讀文本文件中的每一行。如果你能幫忙,請幫忙。謝謝。 :) – 2012-08-14 14:49:18

回答

1

@entire_file = <MYFILE>; 

後,您必須保存在陣列中@entire_file整個文件。之後你對readline操作符(<..>)所做的其他操作都不起作用,因爲該文件已被完整讀取。

你也可以遍歷數組中的元素,做任何你想要與他們,例如,

foreach my $line (@entire_file) { 
    if ($line =~ /^gi/) { print "Descriptor: $line" } 
    else { print "Sequence: $line" } 
} 

我建議你閱讀文件,模式匹配念起來和一般的循環。

+0

考慮在條件空白行被跳過之前添加'next,除非$ line =〜/ \ S /;'否則它們將顯示爲一個序列。另外,FASTA行實際上以>開始,但當前的格式不會顯示這些字符,因此需要'$ line =〜/ ^> gi /'。 – Kenosis 2012-08-14 16:52:13

+0

感謝您的幫助和反饋。我會去做。 :) – 2012-08-14 17:52:32

1

如果陣列中的全部文件的線,你可以通過該數組迭代搶ID /描述符和序列的元素W/O使用正則表達式:

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 

輸出:

$VAR1 = [ 
      '>gi|171361', 
      '>gi|171362' 
     ]; 
$VAR2 = [ 
      'Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs', 
      'Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald' 
     ]; 
$VAR3 = [ 
      'GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC', 
      'GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC' 
     ]; 
3

以下是使用BioPerl的模塊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 
+0

使用'Bio :: SeqIO'模塊是一個很好的解決方案,所以+1。已更新我的顯示ID。 – Kenosis 2012-08-14 18:31:45

+0

我建議使用bio perl。但你也可以嘗試http://code.izzid.com/2011/10/31/How-to-read-a-fasta-file-in-perl.html – ekawas 2012-08-14 18:37:45

0

如果你只是想通過命令行的序列,這一個班輪將做到這一點:

perl -lane 'print $F[-1] if @F' data.txt 

詳見perlrun(1)

使用 awk

類似的解決方案:

awk 'NF { print $NF }' data.txt