使用 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
我在数据文件中有 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