【问题标题】:Extracting characters every 2000 characters and save files每 2000 个字符提取字符并保存文件
【发布时间】:2014-02-18 12:38:48
【问题描述】:

我需要为一个程序做一个输入,这真的超出了我的编程技能,这就是我没有尝试任何东西的原因。希望你能帮帮我。

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

【问题讨论】:

  • 如果提取前 2000 个字符,那么第二个文件 rom the character 1500 to the character 3500, 怎么来?
  • 我猜是重叠的。
  • 是的,我需要每2000个字符提取每个样本的数据,重叠500个。这就是为什么第一个窗口将从位置0到2000,下一个窗口从1500到3500,等等。
  • '如果最后一个窗口少于 2000 个字符' 不清楚你在说什么;你的意思是如果有 3300 个字符,所有 3300 都进入第一个窗口(因为没有足够的第二个窗口?)
  • 是的,就是这样。例如,我更喜欢一个 2000+ 的窗口,而不是两个窗口,一个是 2000,另一个是 300 个字符

标签: python perl bash shell


【解决方案1】:

在 Perl 中你可以这样做,它看起来不是那么有效,但它可以工作,因为 op 系统会缓存文件。

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);    

【讨论】:

  • 不错的解决方案。但是我相信您在打开$ofh 时忘记了要附加的&gt;,否则您将仅以最后一块的窗口结束。另外,我不确定 op 是否希望删除换行符。但我当然可能错了。
  • 感谢您的回答。我尝试运行它,但收到此错误:全局符号“$i”需要在 sites_window.pl 第 11 行显示包名
  • 我在for循环中有错字,请再试一次
  • @DeVadder: 因为 $i 文件名将是 uniq
  • @user1126070 啊抱歉,我实际上错过了$samplename,而不是$i,但你仍然是对的,当然。从这个问题中,我假设操作员每个窗口只需要一个文件,其中包含来自所有样本的该窗口的数据,而不是每个窗口和样本一个文件。但是,如果我理解正确的话,这可能并不重要,而且很容易调整。无论哪种方式,我真的很喜欢你的解决方案,我怀疑有一个更有效的解决方案。毕竟,您只需要读取和循环一次所有内容。
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多