我有一组存储在文本文件中的矩阵。我想计算输出矩阵的元素平均值的输出矩阵。举例如下:
cat file1.txt
Item0 Item1
Item0 1.01456e+06 5
Item1 2 12.2
cat file2.txt
Item0 Item1
Item0 1.0274e+06 6
Item1 0 14.5
cat output.txt
Item0 Item1
Item0 1020980 5.5
Item1 1 13.35
请注意,输入矩阵中的某些值位于engineering notation
中。
欢迎所有建议!
答案 0 :(得分:3)
awk -v row=2:3 -v col=2:3 -v num=2 '
BEGIN {
split(row, r, ":")
split(col, c, ":")
n = num
}
r[1]<=FNR && FNR<=r[2] {
for(i=c[1];i<=c[2];i++)
{
m[FNR,i]+=$i
}
}
END {
for(i=r[1];i<=r[2];i++)
{
for(j=c[1];j<=c[2];j++)
{
printf("%f\t", m[i,j]/n)
}
print ""
}
}' file{1,2}.txt
1020980.000000 5.500000
1.000000 13.350000
答案 1 :(得分:2)
我建议分两个阶段进行。首先,将矩阵转换为(行号,列号,值)三元组的行。为简单起见,我假设没有行和列标签的矩阵。
for f in file*.txt
do
awk '{ for (n=1; n<=NF; n++) { print NR, n, $n } }' $f
done
第一步以更容易处理的方式将所有矩阵抛在一起。
接下来,通过将三元组输入awk来计算平均值:
awk -v Rows=2 -v Cols=2 Mats=2 '
{
sum[$1, $2] += $3
}
END {
for (m=1; m<=Rows; m++) {
for (n=1; n<=Cols; n++) {
printf("%s ", sum[m, n])
}
printf("\n")
}
}'
为简单起见,我只是将行,列和矩阵的数量作为awk变量传递。你可以改为从三元组中确定那些。