[英]Split a column then sum and push sum onto array in 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|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";
}
任何幫助表示贊賞。
始終包括use strict;
並use warnings;
在每個腳本的頂部。
將變量限制在最小范圍內,因為在while
循環之外聲明$NVAR
引入一個錯誤。 您的總和可以通過以下方式固定:
my $NVAR = 0;
foreach (@counts){
#$NVAR=${$_}[0] + ${$_}[1]; <-- this was bad.
$NVAR += $_;
}
但是,可以使用perl oneliner解決此問題
perl -MList::Util=sum -lane 'push @F, 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
注意,您也可以在腳本中使用List::Util sum
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.