我正在处理一个文件(fasta 文件),这是格式-
>chr1 AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGC CAAACCCCAAAAAAAAAAGAACCCTAACACCAGCCTAACCAGATTTCAAAT TTTTATCTTTAGGCGGTATGCACTTTTAACAAAAAAANNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN GCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCATACCCCGAAC CAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCNNNN >chrM GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCAT TTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTG GAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATT CTATTATTTATCGCACCTACGTTCAATATACAGGCGAACATACCCACTA AAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAAT GTCTGCACAGCCGCTTTCCACACAGACATAACAAAANAATTTCCACC
我想使用滑动窗口方法(非重叠窗口,大小 = 50)。我想在 50bp 窗口中找到每个字符的坐标,但不包括 N。第一个 chr1 的输出应该是->
chr1 0 50 chr1 50 100 chr1 100 215 chr1 215 265
代码是 -
use warnings;
*ARGV or die "No input file specified";
open *first, '<',$ARGV[0] or die "Unable to open input file: $!";
$start=1;
while(<first>) {
chomp;
if ( /(>)(\w)/ ) { #taking lines which have name of chromosome
@arr=split(">"); #splitting at ">" character and in $arr[1], there is chr name now
if (defined @array){
foreach (@array){
$length++;
if($_ ne N){
$non++;
if ($non == 50){
print $chr,"\t",$start,"\t",$length,"\n";
$start=$length;
$non=0;
}
}
}
}
undef @array;
$length=0;
$non=0;
$start=0;
}
else {
@count=split(//, $_); #splitting each character in line
push(@array,@count); #storing each character in array till we find next chromosome
$chr=$arr[1];
}
}
foreach (@array){
$length++;
if($_ ne N){
$non++;
if ($non == 50){
print $chr,"\t",$start,"\t",$length,"\n";
$start=$length;
$non=0;
}
}
}
问题是我的 fasta 文件很大,这段代码占用了大量内存和时间。您能否提出建议,如何使用更少的内存使其快速运行。
谢谢