每2000个字符提取一次字符并保存文件

时间:2014-02-18 12:38:49

标签: python perl bash shell

我需要为一个程序做一个输入,这实际上超出了我的编程技能,这就是为什么我没有尝试过任何东西。希望你能帮助我。

我有很多文字文件,以“>”开头每个样本的样本名称,换行符,然后是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可以解决此问题,请同时发布您的答案。

1 个答案:

答案 0 :(得分:1)

在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 "<$samplename\n$data\n";
        close($ofh);
    }
}
close($fh);