从序列中删除给定的字母范围

时间:2013-09-02 06:31:17

标签: perl excel

FILE1

1   M   S   S   N   S   D   T   G   D   L   Q   E   S   L   K   H   G   L   T   P   I   G   A   G   L   P   D   R   H   G   S   P   I   P   A   R   G   R   L   V   M   L   P   K   V   E   T   E   A   L   G   L   A   R   S   H  

2   M   H   S   S   N   P   K   V   R   S   S   P   S   G   N   T   Q   S   S   P   K   S   K   Q   E   V   M   V   R   P   P   T   V   M   S   P   S   G   N   P   Q   L   D   S   K   F   S   N     

3   M   N   G   H   S   D   E   E   S   V   R   N   S   S   G   E   S   S   Q   S   D   D   D   S   G   S   A   S   G   S   G   S   G   S   S   S   G   S   S   S   D   G   S  

FILE2

1 9 24 36 40
2 1 14 19 35
3 8 37

期望的输出

文件2包含制表符分隔的数字,所有行中的每两个数字都是需要从相应序列中删除的字母范围(制表符分隔文件1)。例如对于序列1,我需要打印从1到8 (不是9到24),25到35 (不是36到40)的字母,以及41到肽的末尾。

我的代码(不完美)

#!usr/bin/perl -w
use warnings;
open( FH, "a.txt" );
@seq = <FH>;
open( FH1, "b.txt" );
@num = <FH1>;
open( OUT, ">out.txt" );
@seqs = split( /\n/, "@seq" );
@nums = split( /\n/, "@num" );

foreach $new (@nums) {
    @num1 = split( '\t', $new );
    $n1   = $num1[1];
    $n2   = $num1[2];
    $n3   = $num1[3];
    $n4   = $num1[4];
}
foreach $old (@seqs) {
    @seq1 = split( '\t', $old );
    $len = @seq1;
    print OUT"@seq1[0..$n1,$n2..$n3,$n4..$len]";
}
close FH;
close FH1;
close OUT;  

注意:原始文件要大得多,分割可能会内存不足

1 个答案:

答案 0 :(得分:6)

首先,始终使用use warnings; AND use strict;use Data::Dumper;在这里真的会帮助你。

此外,您可以从shebang行中删除多余的-w (warnings)标记。

> original files are much much larger and split may go out of memory

您不应该将整个文件读入内存:@array = <FH>;

相反,你应该逐行:while (my $line = <$FH>) {

这将我们带到另一个问题......你应该使用3-arg lexically scoped open

open my $fh, ">", $file;

接下来,@nums = split( /\n/, "@num");有一些问题。

  1. 丢失变量周围的引号。
  2. @nums将包含行数,这就是它。
  3. 所以,一旦你解决了这一切......

    foreach循环的逻辑错误。

    当文件中每行的内容不相同时,为什么要对4个值进行硬编码?在最后一次传递中的含义,只有2个值,您从split分配4个。

    好像你的意思是同时对每个阵列进行操作......

    如,

    # While array != null
    
    # # read nums array for indecies to skip
    
    # # grab same row of data to print missing values you want skipped
    
    # # print data to output file...
    
    # end
    

    老实说,我会修复/重写整个脚本。如果你还有问题,请回到这里。