2013-07-03 13 views
0

我正在處理.fasta文件的頭文件(這是一個普遍用於遺傳學/生物信息學以存儲DNA/RNA序列數據)。 Fasta文件的頭部以>符號開頭(給出特定的信息),後面跟着頭部描述的下一行的實際序列數據。序列數據無限期延伸,直到下一個標題及其相應序列之後的下一個\ n。例如:簡化列表/數組的元素,然後向它們添加增量標識符a,b,c,d ....等

>scaffold1.1_size947603 
ACGCTCGATCGTACCAGACTCAGCATGCATGACTGCATGCATGCATGCATCATCTGACTGATG.... 
>scaffold2.1_size747567.2.603063_605944 
AGCTCTGATCGTCGAAATGCGCGCTCGCTAGCTCGATCGATCGATCGATCGACTCAGACCTCA.... 

等等...

所以,我與基因組與我一起工作的有機體的FASTA頭一個問題。不幸的是,解決這個問題所需的perl專業知識似乎超出了我目前的技能水平:S所以我希望有人能在這裏向我展示如何做到這一點。

我的基因組由大約25000個fasta頭文件和它們各自的序列組成,它們當前狀態下的頭文件給我帶來很多麻煩,我嘗試使用序列校準器,所以我必須將它們顯着簡化。這是我的第幾個頭的一個例子:

>scaffold1.1_size947603 
>scaffold10.1_size550551 
>scaffold100.1_size305125:1-38034 
>scaffold100.1_size305125:38147-38987 
>scaffold100.1_size305125:38995-44965 
>scaffold100.1_size305125:76102-78738 
>scaffold100.1_size305125:84171-87568 
>scaffold100.1_size305125:87574-89457 
>scaffold100.1_size305125:90495-305068 
>scaffold1000.1_size94939 

基本上我想提煉這些看起來像這樣:

>scaffold1.1a 
>scaffold10.1a 
>scaffold100.1a 
>scaffold100.1b 
>scaffold100.1c 
>scaffold100.1d 
>scaffold100.1e 
>scaffold100.1f 
>scaffold100.1g 
>scaffold1000.1a 

或者甚至這個(不過這似乎將是更加複雜):

>scaffold1.1 
>scaffold10.1 
>scaffold100.1a 
>scaffold100.1b 
>scaffold100.1c 
>scaffold100.1d 
>scaffold100.1e 
>scaffold100.1f 
>scaffold100.1g 
>scaffold1000.1 

我在這裏做的是擺脫基因組的每個腳手架的所有大小數據。對於偶發碎片的支架,我想用a,b,c,d等表示它們。有幾個支架有26個以上的碎片,所以我可以用x,y,z,A, B,C,d ....等。

我在想這樣做一個簡單的替換與此類似foreach循環:

#!/usr/bin/perl -w 

### Open the files 
$gen = './Hc_genome/haemonchus_V1.fa'; 
open(FASTAFILE, $gen); 
@lines = <FASTAFILE>; 
#print @lines; 

###Add an @ symbol to the start of the label 
my @refined; 
foreach my $lines (@lines){ 
    chomp $lines; 
    $lines =~ s/match everything after .1/replace it with a, b, c.. etc/g; 
    push @refined, $lines; 
} 
#print @refined; 


###Push the array on to a new fasta file 
open FILE3, "> ./Hc_genome/modded_haemonchus_V1.fa" or die "Cannot open output.txt: $!"; 

foreach (@refined) 
{ 
    print FILE3 "$_\n"; # Print each entry in our array to the file 
} 
close FILE3; 

但我不知道要建在在匹配和替換運算符中添加$ 1和\ n之間的字母標籤添加。基本上,因爲我不知道如何依次通過字母表爲每個特定腳手架的片段(我可以管理的是在每個腳手架的開始處添加一個...)

請如果您不要不介意,讓我知道我可以做到這一點!

非常感謝!

安德魯

+0

http://bioperl.org/wiki/Main_Page – toolic

回答

2

在Perl,增量運營商++相對於字符串「神奇」的行爲。例如。 my $s = "a"; $a++增量$a"b"。這一直持續到"z",其中增量將產生"aa"等等。

您文件的標題看起來是正確排序的,所以我們可以循環遍歷每個標題。從頭文件中,我們提取起始部分(包括.1在內的所有內容)。如果這個起始部分與前一個頭部的起始部分相同,我們增加我們的序列標識符。否則,我們將其設置爲"a"

use strict; use warnings; # start every script with these 

my $index = "a"; 
my $prev = ""; 

# iterate over all lines (rather than reading all 25E3 into memory at once) 
while (<>) { 

    # pass through non-header lines 
    unless (/^>/) { 
    print; # comment this line to remove non-header lines 
    next; 
    } 

    s/\.1\K.*//s; # remove everything after ".1". Implies chomping 

    # reset or increment $index 
    if ($_ eq $prev) { 
    $index++; 
    } else { 
    $index = "a"; 
    } 

    # update the previous line 
    $prev = $_; 

    # output new header 
    print "$_$index\n"; 
} 

用法:$ perl script.pl <./Hc_genome/haemonchus_V1.fa >./Hc_genome/modded_haemonchus_V1.fa

編寫接受STDIN輸入並寫入STDOUT的程序被認爲是一種很好的風格,因爲這樣可以提高靈活性。而不是在perl腳本中硬編碼路徑,請保持腳本通用,並使用shell重定向運算符(如<)來指定輸入。這也爲您節省了手動打開文件的麻煩。

輸出示例:

>scaffold1.1a 
>scaffold10.1a 
>scaffold100.1a 
>scaffold100.1b 
>scaffold100.1c 
>scaffold100.1d 
>scaffold100.1e 
>scaffold100.1f 
>scaffold100.1g 
>scaffold1000.1a 
+0

非常感謝您的回答阿蒙。雖然由於某種原因,我似乎無法複製實際的fasta文件的結果。似乎只有'a'被添加到碎片腳手架的fasta頭文件中。例如。的grep -n scaffold100 ./Hc_genome/sim_haemonchus_V1.fa 1374098:> scaffold100.1a 1375367:> scaffold100.1a 1375398:> scaffold100.1a 1375599:> scaffold100.1a 1375688:> scaffold100.1a 1375803:> scaffold100.1a 1375868:> scaffold100.1a 任何想法可能會阻止$ index ++的積累?難道每個fasta頭文件之間都有一些序列?這與前者不同。以上? – amrezans

+1

@amrezans我以前假設只有標題出現在輸入中。我添加了一些代碼來測試該行是否爲標題。 – amon

+0

再次感謝您的解決方案和建議!工作很棒! – amrezans

相關問題