在第1列中查找每个不同变量的多个列的平均值

时间:2017-07-17 08:49:50

标签: linux awk sum average uniqueidentifier

嗨我有一个包含6列的文件,我希望知道其中三个(第2,3,4列)的平均值以及第一列中每个唯一变量的最后两个(第5列和第6列)的总和

A1234 0.526 0.123 0.456 0.986 1.123
A1234 0.423 0.256 0.397 0.876 0.999
A1234 0.645 0.321 0.402 0.903 1.101
A1234 0.555 0.155 0.406 0.888 1.009
B5678 0.111 0.345 0.285 0.888 0.789
B5678 0.221 0.215 0.305 0.768 0.987 
B5678 0.336 0.289 0.320 0.789 0.921

我遇到的代码会根据第一列获得第2列的平均值,但无论如何我可以在列中扩展它吗?感谢

awk '{a[$1]+=$2; c[$1]++} END{for (i in a) printf "%d%s%.2f\n", i, OFS, a[i]/c[i]}'

我希望输出格式如下;第一列中的每个变量也会有不同的行数

A1234 0.53725 0.21375 0.41525 3.653 4.232
B5678 0.22233 0.283 0.30333 2.445 2.697

4 个答案:

答案 0 :(得分:1)

awk '{a[$1]+=$2;b[$1]+=$3;c[$1]+=$4;d[$1]+=$5;e[$1]+=$6;f[$1]++} END{for (i in a) print i,a[i]/f[i],b[i]/f[i],c[i]/f[i],d[i],e[i]}' file

O / P:

B5678 0.222667 0.283 0.303333 2.445 2.697
A1234 0.53725 0.21375 0.41525 3.653 4.232

答案 1 :(得分:0)

计算第2,3,4列的平均值:

 awk '{ sum += $2 + $3 + $4 } END { print sum / (NR * 3) }'

按第1列计算第5列和第6列的总和:

 awk '{ arr[$1] += $5 + $6 } END { for (a in arr) if (a) print a, arr[a] }'

计算最后一行的第5列和第6行:

 tail file -1 | awk '{sum += $5 + $6} END {print sum}'

答案 2 :(得分:0)

尝试关注一次并告诉我这是否对您有所帮助。

awk '{A[$1]=A[$1]?A[$1]+$5+$6:$5+$6;C[$1]=C[$1]?C[$1]+$2+$3+$4:$2+$3+$4;B[$1]++} END{for(i in A){print "Avg. for " i" =\t",C[i]/(B[i]*3) RS "Count for " i" =\t",A[i]}}'  Input_file

编辑: 现在也添加一种非单一形式的解决方案。

awk '{
        A[$1]=A[$1]?A[$1]+$5+$6:$5+$6;
        C[$1]=C[$1]?C[$1]+$2+$3+$4:$2+$3+$4;
        B[$1]++
     }
        END{
                for(i in A){
                                print "Avg. for " i" =\t",C[i]/(B[i]*3) RS "Count for " i" =\t",A[i]
                           }
           }
    '   Input_file

答案 3 :(得分:0)

awk 解决方案:

awk '{ a[$1]++; avg[$1]+=$2+$3+$4; sum[$1]+=$5+$6 }
     END{ for(i in a) printf "%s%.2f%s%.2f\n",i OFS,avg[i]/(a[i]*3),OFS,sum[i] }' file

输出(第2列 - 平均值 值,第3列 - 总和 值):< / p>

B5678 0.27 5.14
A1234 0.39 7.88