我有以下数据,用空格分隔:
SampleX=1,1,2,3 SampleY=1,1,2,3 SampleZ=1,1,2,3
SampleX=0,0,0,1 SampleY=.,.,.,. SampleZ=0,1,1,1
我想对每一行进行汇总,获取所有样本中每个值的平均值,忽略点。所以第一行有 3 个样本,每个样本包含 4 个值。每个值的平均值表示如下:
A B C D
1 1 2 3
0 0.5 0.5 1
我已经做了类似的事情,但不是平均,我得到的计数如下:
SampleX=1/1 SampleY=0/0 SampleZ=1/1
SampleX=0/1 SampleY=./. SampleZ=1/0
结果是事件计数(0/0=A、1/0 或 0/1=B 和 1/1=C)
A B C
1 0 2
0 2 0
使用:
echo "SampleA=1/1 SampleB=0/0 SampleC=1/1
SampleA=0/1 SampleB=./. SampleC=1/0" | awk 'BEGIN {OFS="\t"; print "A\tB\tC"} {B=gsub(/0\|1|1\|0|0\/1|1\/0/, ""); A=sub(/1\|1|1\/1/, ""); C=gsub(/0\|0|0\/0/, ""); print A,B,C}'
但我不知道如何用逗号做同样的事情并获得平均值而不是计数。
我会使用 Perl 做什么(它不应该太慢):
perl -F'=(\d+),(\d+),(\d+),(\d+)' -ne '
BEGIN{ our $max = 3; }
foreach my $i (0..2) {
$mymax = $max;
if (/\./) {
--$mymax;
}
my $sum = 0;
map { $sum += $_ } @F[1+$i,6+$i,11+$i];
printf "%.2f ", $sum/$mymax;
print "\n" if $i == 2;
}
' file
1.00 1.00 2.00
0.00 0.50 0.50