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

2024-04-25 09:58:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有100个文件名为file.1.netcc,file.2.netcc。。。文件.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编码实现这一点?也许是努比?你知道吗


Tags: 文件of命令number文件名withnetworkfile
2条回答

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表示计数器的标志/指示符_cfc是文件计数器。您可以将标志和计数器组合起来,但将更难解释。你知道吗

使用gnuawk

适用于格式为# 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匹配(注意结尾的空格)。您可以根据需要修改图案。如果此模式匹配,则将key设置为$2,即key=CCkey=FX

PROCINFO["sorted_in"]="@ind_num_asc":根据键对关联数组a排序。排序顺序在遍历过程中得到反映。你知道吗

ARGIND<=100{...}:此块汇总每个文件的数组元素。将100更改为您要播放的文件的任意数量

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

相关问题 更多 >