我正在研究一个生物信息学项目,我正在研究非常大的基因组。Seg一次只能读取135行,所以当我们输入其中的基因组时就会过载。我正试图创建一个perl命令,将这些部分分成135行部分。字符限制为10800,因为有80列。这就是我目前所拥有的

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

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



substr($str,17) = "";

print "$str";

它在第17个字符处拆分,但只打印该部分,我希望它继续打印其余数据。如何添加允许显示其余数据的命令。就像它应该在每17个字符继续分裂。(然后我当然可以回去把它放大到我真正需要的大小。)

最佳答案

我假设“非常大的基因组”存储在一个非常大的文件中,并且可以按行数(而不是字符数)收集数据,因为这是第一个提到的标准。
然后,您可以逐行读取文件并组装行,直到有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)。

关于linux - 如何将数据分成足够小的块以馈送到Seq?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44505073/

10-12 14:15
查看更多