2014-10-20 54 views
0

我有一些成功的代碼,如果一個數字位置(來自另一個文件)位於其中,並且將正則表達式捕獲和原始位置打印爲結果。在FASTA頭文件中成功匹配後打印下一行

文件1點的示例數據:

7065_8#10 9436 - t 
7065_8#10 126477 - c 
7065_8#10 413711 + T 

文件2的示例數據:

>SAEMRSA15_00020 dnaN_DNA_polymerase_III,_beta_chain 2156 3289 forward 
ATGATGGAATTCACTATTAAAAGAGATTATTTTATTACACAATTAAATGACACATTAAAAGCTATTTCACCAAGAACAACATTACCT 
>SAEMRSA15_00060 gyrA_DNA_gyrase_subunit_A 7005 9674 forward 
ATGTCGGAAAAAGAAATTTGGGA 

代碼:

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 

my $outputfile = "/Users/edwardtickle/Documents/CC22CDS.txt"; 

open FILE1, "/Users/edwardtickle/Documents/CC22indels.tab"; 

open FILE2, "/Users/edwardtickle/Documents/CC22_CDS_rmmge.aln"; 

open(OUTPUTFILE, ">$outputfile"); 
my @file1list =(); 

while (<FILE1>) { 
    if (/^\S+\s+(\d+)/) { 
     push @file1list, $1; 
    } 
} 

close FILE1; 

while (<FILE2>) { 
    if (/^>(\S+\s+\S+\s+(\d+)\s+(\d+)\s+(\S+))/) { 
     my $cds1 = $1; 
     my $cds2 = $2; 
     my $cds3 = $3; 
     my $cds4 = $4; 

     for my $cc22 (@file1list) { 
      if ($cc22 > $cds2 && $cc22 < $cds3) { 
       print OUTPUTFILE "$cc22 $cds2 $cds3 $cds4\n"; 
      } 
     } 
    } 
} 

close FILE2; 

例如輸出:

9436 7005 9674 forward 

除了捕獲的信息外,我還希望在匹配後打印FASTA文件的下一行,其中包括該基因的序列數據。我希望在原始數據之後的下一行被打印在同一行上。這聽起來非常簡單,但我無法解決如何做到這一點!我試圖使用以前的答案,並將其併入我的代碼無濟於事(如下所示)。如果可能的話,請你改編我的代碼,而不是爲原始的正確代碼提供一個全新的方法,我試圖確保我理解我使用的每一個腳本,而不是簡單地粘貼在答案中。

所需的輸出:

9436 7005 9674 forward ATGTCGGAAAAAGAAATTTGGGA 

錯誤代碼:

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 

my $outputfile = "/Users/edwardtickle/Documents/CC22CDS.txt"; 

open FILE1, "/Users/edwardtickle/Documents/CC22indels.tab"; 

open FILE2, "/Users/edwardtickle/Documents/CC22_CDS_rmmge.aln"; 

open(OUTPUTFILE, ">$outputfile"); 
my @file1list =(); 

while (<FILE1>) { 
    if (/^\S+\s+(\d+)/) { 
     push @file1list, $1; 
    } 
} 

my $nextline = 0; 
close FILE1; 

while (my $line = <FILE2>) { 
    if (/^>(\S+\s+\S+\s+(\d+)\s+(\d+)\s+(\S+))/) { 
     my $cds1 = $1; 
     my $cds2 = $2; 
     my $cds3 = $3; 
     my $cds4 = $4; 

     for my $cc22 (@file1list) { 
      if ($cc22 > $cds2 && $cc22 < $cds3) { 
       if ($nextline) { 
        print OUTPUTFILE "$cc22 $cds2 $cds3 $cds4 $nextline\n"; 
        $nextline = ($line =~ /^>(\S+\s+\S+\s+(\d+)\s+(\d+)\s+(\S+))/); 
       } 
      } 
     } 
    } 
} 

close FILE2; 

提前感謝!

+0

能ÿ ou添加一些示例數據? – 2014-10-20 15:57:12

+0

對不起,我剛添加它。 – 2014-10-20 16:39:46

回答

2

的問題是,你永遠不給$nextline值:

for my $cc22 (@file1list) { 
     if ($cc22 > $cds2 && $cc22 < $cds3) { 
      if ($nextline) { 
       ... 
      } 
     } 
    } 

有無處在環路$nextline才能完成設置,所以永遠不會執行if ($nextline)聲明。要改變這一點,你需要改變你的代碼,以便$nextline確實被初始化。由於您沒有發佈任何輸入數據,因此確切知道應該做什麼有點困難,但假設您在一行中獲得匹配,然後想要打印一些細節以及匹配之後的行的順序,使用下面的輸入文件1

my $nextline; 
while (my $line = <FILE2>) { 
    if ($line =~ /^>(\S+)\s+\S+\s+(\d+)\s+(\d+)\s+(\S+)/) { 
     my $cds1 = $1; 
     my $cds2 = $2; 
     my $cds3 = $3; 
     my $cds4 = $4; 

     # pull in the next line 
     $nextline = <FILE2>; 

     for my $cc22 (@file1list) { 
      if ($cc22 > $cds2 && $cc22 < $cds3) { 
       # print out the first part of the line without a line break 
       # and the next line, which already has the line break on it. 
       print OUTPUTFILE "$cc22 $cds2 $cds3 $cds4 $nextline"; 
      } 
     } 
    } 
} 

7065_8#10 992 - t 
7065_8#10 2264 - c 
7065_8#10 413711 + T 

輸出:您可以編輯代碼以下

992 517 1878 forward ATGTCGGAAAAAGAAATTTGGGA 
2264 2156 3289 forward ATGATGGAATTCACTATTAAAAGAGATTATTTTATTACACAATTAAATGACACATTAAAAGCTATTTCACCAAGAACAACATTACCT 
+0

感謝您解釋每一步,這是一個很大的幫助。我編輯了我的代碼以包含該部分,但我不斷收到每行的錯誤信息:在模式匹配(m //)處使用未初始化值$ _ ./nextline.pl第34行。這是'elsif'行我看不到它可能涉及的價值。 – 2014-10-20 16:48:57

+0

我現在正在得到一個數據輸出,但它與下一行代碼前輸出相同,只是它將每個範圍內的所有位置組合在一起(這非常有用)。每個範圍的序列仍然沒有打印。 – 2014-10-20 17:03:59

+0

我沒有編輯任何正則表達式,並查看提供的數據,我認爲您只需要執行'print OUTPUTFILE $ line'來打印出序列。我不認爲'$ line =〜/ ^>.../'正在捕獲正確的東西。讓我檢查... – 2014-10-20 17:11:34

0

您從$nextline = 0開始。然後,您只更改以if ($nextline)開頭的塊中的$ nextline。塊永遠不會輸入,因爲$ nextline是0(false)。因此,直到腳本結束時,$ nextline保持爲0。

+0

請你能稍微擴展一下嗎?我正在努力想辦法解決這個問題,以及如何將它應用到我的代碼中。乾杯。 – 2014-10-20 15:52:37

+0

@EdTickle:你可以添加一些示例數據嗎? – choroba 2014-10-20 16:07:04

+0

完成,對不起,因爲不這樣做更早! – 2014-10-20 17:20:29

相關問題