使用 AWK 获取逗号分隔值的平均值

问题描述 投票:0回答:1

我有以下数据,用空格分隔:

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}'

但我不知道如何用逗号做同样的事情并获得平均值而不是计数。

awk mean
1个回答
0
投票

我会使用 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
© www.soinside.com 2019 - 2024. All rights reserved.