我有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可能吗?
答案 0 :(得分:1)
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
的一些命名约定_c
。 fc
是文件计数器。您可以组合标记和计数器,但更难以解释。
答案 1 :(得分:1)
使用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=CC
或key=FX
等
PROCINFO["sorted_in"]="@ind_num_asc"
:根据键对关联数组a
进行排序。排序顺序在遍历期间反映出来。
ARGIND<=100{...}
:此块总结每个文件的数组元素。将100更改为您想要播放的任意数量的文件
END {..}
阻止:遍历数组并打印每个元素的平均值。 ARGIND
这里将表示文件的数量,因此表示每个索引的矩阵元素总数。