在perl中拆分一列,然后求和,并将求和推送到数组上

在perl中拆分一列,然后求和,并将求和推送到数组上,perl,Perl,我有一个文件如下所示: LOCUS POS ALIAS VAR TEST P I DESC CCL23|disruptive chr17:34340329..34340854 . 2 BURDEN 1 0.43 0/1 CCL23|disruptive chr17:34340329..34340854 . 2 BURDEN 1 0.295 0/1 CCL23|di

我有一个文件如下所示:

LOCUS POS ALIAS VAR TEST P I DESC  
CCL23|disruptive chr17:34340329..34340854        .       2       BURDEN  1       0.43    0/1  
CCL23|disruptive     chr17:34340329..34340854        .       2       BURDEN  1       0.295   0/1  
CCL23|disruptive      chr17:34340329..34340854        .       2       BURDEN  1       0.005   1/1  
CCL23|disruptive     chr17:34340329..34340854        .       2       BURDEN  0.676617        0.005   1/0  
我想将最后一个字段拆分为“/”,然后对这些数字求和,并将另一列与之相加。例如,我希望输出如下所示:

CCL23|disruptive chr17:34340329..34340854        .       2       BURDEN  1       0.43    0/1 1  
CCL23|disruptive     chr17:34340329..34340854        .       2       BURDEN  1       0.295   0/1 1  
CCL23|disruptive      chr17:34340329..34340854        .       2       BURDEN  1       0.005   1/1 2  
CCL23|disruptive     chr17:34340329..34340854        .       2       BURDEN  0.676617        0.005   1/0 1  
我有这个代码,但不起作用:

#! perl -w

my $file1 = shift@ARGV;

my $NVAR=0;
my @vars;
open (IN, $file1) or die "couldn't read file one";
while(<IN>){
    my@L=split;
    next if ($L[0] =~ m/LOCUS/);
    my@counts=split /\//, $L[7];
    foreach (@counts){
        $NVAR=${$_}[0] + ${$_}[1];
    }

    push @vars,[$L[0],$L[1],$L[2],$L[3],$L[4],$L[5],$L[6],$L[7],$NVAR];
}

close IN;

print "LOCUS POS ALIAS NVAR TEST P I DESC SUM\n";
foreach(@vars){
    print "@{$_}\n";
}
#!perl-w
我的$file1=shift@ARGV;
我的$NVAR=0;
我的@vars;
打开(在$file1中)或死亡“无法读取文件1”;
while(){
my@L=分割;
下一个if($L[0]=~m/LOCUS/);
my@counts=拆分/\/,$L[7];
foreach(@counts){
$NVAR=${$}[0]+${$}[1];
}
推送@vars、[$L[0]、$L[1]、$L[2]、$L[3]、$L[4]、$L[5]、$L[6]、$L[7]、$NVAR];
}
接近;
打印“轨迹位置别名NVAR测试PI描述和\n”;
foreach(@vars){
打印“@{$}\n”;
}
感谢您的帮助。

请始终在每个脚本的顶部包含和

将变量限制在尽可能小的范围内,因为在
循环引入错误时,在
之外声明
$NVAR
。您的总和可以通过以下方式确定:

my $NVAR = 0;
foreach (@counts){
    #$NVAR=${$_}[0] + ${$_}[1];  <-- this was bad.
    $NVAR += $_;
}
或者,如果您有标题行:

perl -MList::Util=sum -lane '
        push @F, $. == 1 ? "SUM" : sum split "/", $F[-1];
        print "@F"
    ' file.txt 
注意,您也可以在脚本中使用

perl -MList::Util=sum -lane '
        push @F, $. == 1 ? "SUM" : sum split "/", $F[-1];
        print "@F"
    ' file.txt