使用 awk 使用该列的平均值规范化列数据

normalize column data with average value of that column with awk

我在数据文件中有 3 列,如下所示,最多可继续 250 行:

0.9967   0.7765   0.5798
0.9955   0.7742   0.5767
0.9942   0.7769   0.5734

我想根据每一列的平均值对每一列进行归一化。 我正在使用下面的代码(例如第 1 列),但它没有打印出我想要的输出。

结果应该非常接近 1

awk 'NR==FNR{sum+= ; next}{avg=(NR/sum)}FNR>1{print(/avg)}' f.dat f.dat

第一列的预期输出。

1.003

1.001

0.9988

您需要单独的占位符来存储列的总和和计数。建议使用数组存储每一列。

awk '
    NR==FNR {
        for (col=1; col<=NF; col++) {
            avg[col] += $col
            len[col] += 1
        }
        next
    }
    {
        for (col=1; col<=NF; col++) {
            colAvg = avg[col]/len[col]
            printf "%.3f%s", $col/colAvg, (col<NF ? FS : ORS)
        }
    }

' file file

或者,如果您想使用新的规范化值更新整个 table,请从上面的代码片段中删除 FNR==1。如果您想提高平均值的精度,请将 %.2f 更改为您想要的位数 preferred