我正在研究一个生物信息学项目,我正在研究非常大的基因组。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;
您还可以使用
$.
variable和modulo 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/