2017-06-12 20 views
0

我正在研究一個生物信息學項目,我正在研究非常大的基因組。 Seg一次只能讀取135行,所以當我們餵食基因組時,它會被超載。我正在嘗試創建一個perl命令,將這些部分拆分爲135行部分。由於有80列,因此字符數限制爲10,800。這是我迄今爲止如何將我的數據分成足夠小的區塊以供給Seq?

#!usr/bin/perl 
use warnings; 
use strict; 

my $str = 
'>AATTCCGG 
TTCCGGAA 
CCGGTTAA 
AAGGTTCC 
>AATTCCGG'; 



substr($str,17) = ""; 

print "$str"; 

它拆分在17字符,但只打印該節,我希望它繼續打印數據的其餘部分。我如何添加一個允許顯示其餘數據的命令。就像它應該繼續分裂每17個字符。 (當然,我可以回到原來的尺寸並將其縮放到我實際需要的尺寸)。

+0

歡迎使用stackoverflow。看看[我應該怎麼做當有人回答我的問題?](http://stackoverflow.com/help/someone-answers)。那裏還有很多其他簡短而有用的幫助頁面。 – zdim

回答

0

substr返回字符串的移除部分;你可以在一個循環中運行它:

while (length $str) { 
    my $substr = substr $str, 0, 17, ""; 
    print $substr, "\n"; 
} 
+0

這對基因組無關緊要,但一般來說'0'是一個錯誤的值,所以你可能需要'while(length $ str)'。 – melpomene

+0

@melpomene:true,已更新。 – choroba

1

我假設「非常大的基因組」被存儲在一個非常大的文件,而且它是罰款的行數來收集數據(而不是由字符數),因爲這是第一個提到的標準。

然後,您可以逐行讀取文件並組裝行,直到其中有135行。然後它們交給一個程序或例行程序處理的是,清空緩衝區,並繼續前進

use warnings; 
use strict; 
use feature 'say'; 

my $file = shift || 'default_filename.txt'; 
my $num_lines_to_process = 135; 

open my $fh, '<', $file or die "Can't open $file: $!"; 

my ($line_counter, @buffer); 

while (<$fh>) { 
    chomp; 
    if ($line_counter == $num_lines_to_process) 
    { 
     process_data(\@buffer); 
     @buffer =(); 
     $line_counter = 0; 
    } 
    push @buffer, $_; 
    ++$line_counter; 
} 

process_data(\@buffer) if @buffer; # last batch 

sub process_data { 
    my ($rdata) = @_; 
    say for @$rdata; say '---'; # print data for a test 
} 

如果處理應用程序/例行想要一個字符串,每次都可以追加到一個字符串,而不是添加到數組,$buffer .= $_;並根據需要通過$buffer = '';清除。

如果您需要傳遞一個字符串,但在收集數據時也有一些數組的使用(中間檢查/修剪/處理?),然後將行收集到一個數組中並根據需要使用,然後加入到一個字符串中交給它,my $data = join '', @buffer;

您也可以使用$. variablemodulo operator (%)

while (<$fh>) { 
    chomp; 

    push @buffer, $_; 

    if ($. % $num_lines_to_process == 0) # every $num_lines_to_process 
    { 
     process_data(\@buffer); 
     @buffer =(); 
    } 
} 

process_data(\@buffer) if @buffer; # last batch 

在這種情況下,我們需要先儲存一個線,然後檢查其編號,因爲$.(行號讀取一個文件句柄,參見上面鏈接的文檔)從1(不是0)開始。

+0

@Tvega @Tvega添加了一個更簡單的方法來編輯 – zdim

+0

@Tvega我添加了一行來處理最後一批數據,從上一次清空緩衝區到文件結束。由於該文件可能不完全是循環中未處理的135行的倍數。 – zdim

相關問題