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;
注意:原始文件要大得多,分割可能会内存不足
答案 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");
有一些问题。
所以,一旦你解决了这一切......
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
老实说,我会修复/重写整个脚本。如果你还有问题,请回到这里。