使用来自多个文件的awk计算文件中的平均值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用来自多个文件的awk计算文件中的平均值相关的知识,希望对你有一定的参考价值。

我有100个文件名为file.1.netcc,file.2.netcc ... file.100.netcc。每个文件包含以下内容:

# 4 # Number of network ROIs 
# 2 # Number of netcc matrices 
# WITH_ROI_LABELS 
LFovea_LO LLO LMT RV3A 
1 2 3 4 
# CC 
1.0000  0.2271  -0.1172 -0.2258 
0.2271  1.0000  0.3991  0.1092 
-0.1172 0.3991  1.0000  0.3055 
-0.2258 0.1092  0.3055  1.0000 
# FZ 
4.0000  0.2312  -0.1177 -0.2297 
0.2312  4.0000  0.4226  0.1096 
-0.1177 0.4226  4.0000  0.3156 
-0.2297 0.1096  0.3156  4.0000 

现在,我想要发生的是平均所有'cc'值。每个值都将从所有文件中取平均值。例如,我们从第一列获取第一个值,第一行(1.0000)从所有文件中取平均值并输出为平均值......依此类推,直到最后一个数字,即4列,第4行值(1.0000)对所有文件进行平均。 所以我想要的是返回一个4x4表,其中包含所有文件的平均值。我也希望在它下面的'FZ'类别中完成此操作。我怎样才能做到这一点?

我尝试使用这个命令:

awk '{a[FNR]+="  "$1"  "$2"  "$3"   "$4"  "$5"  "$6"   "$7"   "$8;b[FNR]++;}END{for(i=1;i<=FNR;i++)print i,a[i]/b[i];}' /Users/3dnetcorr/file*.netcc > outputs_averaged.file

但是这个命令做了什么(我认为)是整个列的平均值,每列给我一个值..这不是我想要它做的。

我想我要问的是我如何平均包含矩阵的文件?我怎么能用python编码呢? numpy也许?

答案

awk救援!

awk 'FNR==1 {fc++; cc_f==fz_f=0; cc_c=fz_c=0}
    /^# CC/ {cc_f=1; fz_f=0; next}
    /^# FZ/ {cc_f=0; fz_f=1; next}
    cc_f    {cc_c++; for(i=1;i<=NF;i++) cc[cc_c,i]+=$i}
    fz_f    {fz_c++; for(i=1;i<=NF;i++) fz[fz_c,i]+=$i}
    END {print "CC averages"
         for(i=1;i<=cc_c;i++)
           for(j=1;j<=NF;j++) printf "%.4f%s", cc[i,j]/fc, (j==NF?ORS:OFS)
         print "FZ averages"
         for(i=1;i<=fz_c;i++)
           for(j=1;j<=NF;j++) printf "%.4f%s", fz[i,j]/fc, (j==NF?ORS:OFS)}' file{1..100}

这不会验证文件格式,因此应该跨文件保持一致。它不假设方形矩阵。一些命名约定_f for flag / indicator _c for counter。 fc是文件柜台。您可以组合标志和计数器,但更难以解释。

另一答案

使用gnu awk

适用于格式为# XX的多个矩阵

$ awk '/^# .. $/{key=$2; i=1; PROCINFO["sorted_in"]="@ind_num_asc"; next} 
      !i~/0/ && ARGIND<=100{for(j=1; j<=4; j++) a[key FS i FS j]+=$j; (i>=4)?i=0:i++} 
     END{ 
          for(INDEX in a) { 
            split(INDEX,k,FS); 
            if(!seen[k[1]]++) print "# "k[1]; 
            printf a[k[1] FS k[2] FS k[3]]/(ARGIND)"" (k[3]%4?FS:RS) 
          }
        }' file{1..100}

# CC
8.66667 0.2271 -0.1172 -0.2258
0.2271 1 0.3991 0.1092
-0.1172 4.06577 1 0.3055
-0.2258 0.1092 0.3055 1
# FZ
4 0.2312 -0.1177 -0.2297
0.2312 4 0.4226 0.1096
-0.1177 0.4226 4 0.3156
-0.2297 0.1096 0.3156 4

/^# .. $/:与# CC# FX# RZ比赛(注意最后的空间)。您可以根据需要修改模式。如果这个模式匹配,那么设置密钥为$2,即key=CCkey=FX

PROCINFO["sorted_in"]="@ind_num_asc":基于键对关联数组a进行排序。排序顺序在遍历期间反映出来。

ARGIND<=100{...}:这个块总结了每个文件的数组元素。将100更改为您要使用的任意数量的文件

END {..}块:遍历数组并打印每个元素的平均值。 ARGIND这里将表示文件的数量,因此表示每个索引的总矩阵元素的数量。

以上是关于使用来自多个文件的awk计算文件中的平均值的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWK 处理来自多个文件的输入

awk 表达式

Python:来自多个统计文件的统计摘要

如何计算bash中一列数据中的连续重复次数?

awk 计算数据的和和平均值

将多个 csv 文件中的数据导入一个 Excel 工作表并计算平均值