1

文件1

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  

文件2

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;  

注意:原始文件要大得多,拆分可能会耗尽内存

4

1 回答 1

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 将包含行数,仅此而已。

所以一旦你解决了这一切......

您的逻辑看起来与foreach循环错误。

当文件中每一行的内容不相同时,为什么要硬编码 4 个值?这意味着在最后一次传递中,将只有 2 个值,并且您从split.

似乎您的意思是同时对每个阵列进行操作...

例如,

# 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

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

于 2013-09-02T07:15:26.073 回答