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

使用awk使用该列的平均值规范化列数据,awk,sum,average,normalize,Awk,Sum,Average,Normalize,我在一个数据文件中有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+= $1; next}{avg=(NR/sum)}FNR>1{print($1/avg)}' f.dat f.dat 第一列

我在一个数据文件中有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+= $1; next}{avg=(NR/sum)}FNR>1{print($1/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
awk'
NR==FNR{

对于(col=1;col您的规范化逻辑是什么?只需计算每列的平均值,然后将每行值除以平均值。您想将规范化值打印为一行还是用新值更新所有行?(您能显示预期的输出吗)有关如何正确设置输入、输出和代码的格式,请参阅。有关示例,请参阅@Inian最初如何为您设置输入和代码的格式,并将其应用于您的预期输出。不要仅显示1列的预期输出,除非您想要一个只输出该1列的工具,只需显示所发布内容的完整预期输出即可输入充足。请不要通过破坏您的帖子为其他人做更多的工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下的不可撤销的权利,以分发该内容(即,无论您未来的选择如何)。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被还原。如果您想了解有关删除帖子的更多信息,请参阅:它为所有列和行打印一个值!!@bobcat:正如我在回答中所说的,如果您想更新整个表,请删除
FNR==1
(此外,您从未显示预期的输出)@bobcat:你的意思是什么?你的预期输出是什么?你还没有回答它并不复杂。每个数组中的单个值除以每列的平均值。很简单。@bobcat如果你觉得它很简单,为什么不编辑这个问题来显示你添加的三行输入的预期输出?