我需要为一个程序输入,这真的超出了我的编程技能,这就是为什么我没有尝试任何东西。希望你能帮我。
我有很多文本文件,从符号">"开始,一个样本名称,一个换行符,然后是每个样本的0和1数据。
数据看起来是这样的(实际上要大得多):
>SampleName_ZN189A
01000001000000000000100011100000000111000000001000
00110000100000000000010000000000001100000010000000
00110000000000001110000010010011111000000100010000
00000110000001000000010100000000010000001000001110
>SampleName_ZN189B
00110000001101000001011100000000000000000000010001
00010000000000000010010000000000100100000001000000
00000000000000000000000010000000000010111010000000
01000110000000110000001010010000001111110101000000
注意:每50个字符后有一个换行符
我需要做的是:
提取我文件中每个样本的前2000个字符的数据,并用相同的名称和窗口号保存。例如,如果这个文件名为:Testfile_1.txt,它应该是这样的(我提取了数据的前50个字符):
>SampleName_ZN189A
01000001000000000000100011100000000111000000001000
>SampleName_ZN189B
00110000001101000001011100000000000000000000010001
这个文件应该这样命名:Testfile_1_window1.txt
现在,第二个窗口应该从字符1500开始到字符3500,即Testfile_1_window2.txt,从字符3000到5000的第三个文件名为Testfile_1_window3.txt,依此类推……但如果最后一个窗口的字符少于2000,则应将这些字符添加到最后一个窗口中。
也就是说,由2000个字符的窗口与500个字符的重叠。
提前谢谢。
注2:
如果您认为这个问题可以使用perl或python解决,请同时发布您的答案。
在Perl中,你可以这样做,它看起来不那么有效,但它可以工作,因为操作系统会缓存文件。
use strict;use warnings;
local $/='>';
open(my $fh,'<','filename') or die $!;
while (my $chunk = <$fh>){
chomp($chunk);
$chunk =~ s!^(.+?)n+!!is;
my $samplename = $1;
### how many should be a constant or should be calculated on the fly, currently I set it to 50
for(my $i=0;$i<50;$i++){
my $data = substr($chunk,$i*1500,$i*1500+2000);
next if ! $data;##skip if there is not data
my $filename = "Testfile_".$samplename."_window".$i.".txt";
open(my $ofh,'>',$filename) or die $filename,$!;
print $ofh "<$samplenamen$datan";
close($ofh);
}
}
close($fh);