使用awk查找每列间隔的平均值,而不考虑缺失值

时间:2015-06-29 09:08:33

标签: linux shell awk

我无法找到每列每6行间隔的平均值。这与我之前的帖子有关。我有一个数字列的数据(这里是2)

equals

我想使用awk

main

以上适用于第1栏。所以我可以为第二列替换$ 1到$ 2。但我想在同一个命令中做到这一点。这是我无法做到的。

期望的输出:

input.txt
1   3
4   7
30  //
//  3
10  3
40  1
//  90
//  22
//  11
//  //
//  //
//  //

17是(1 + 4 + 30 + 10 + 40)/ 5; 0是因为没有整数和所有缺失值; 3.4是(3 + 7 + 3 + 3 + 1)/ 5; 41是(90 + 22 + 11)/ 3

1 个答案:

答案 0 :(得分:1)

我认为你应该单独对每一栏进行总结。尝试:

awk '{if($1!="//"){sum1+=$1;count1++;}; if($2!="//"){sum2+=$2;count2++;}}NR%6==0{print count1 ? sum1/count1:0, count2 ? sum2/count2:0;sum1=sum2=count1=count2=0;}' input.txt

[UPDATE:]

如果要计算两个以上的列,则可以使用数组并每次遍历所有列。

awk '{
    for(i=1;i<=NF;++i){
        if($i!="//"){
            sum[i]+=$i;
            count[i]++
        }
    }}
    NR%6==0{
    for(i in sum)
    {
        avg=count[i]?sum[i]/count[i]:0;
        printf("%.2f ",avg);
        sum[i]=0;
        count[i]=0
    }
    printf("\n")
}'
input.txt