如何使用awk将其平均值减去每列?

如何使用awk将其平均值减去每列?,awk,mean,Awk,Mean,我有一个如下文件(但有数千行和数百列) 如何使用awk将其平均值减去每列/字段,以获得这样的结果 -1 0 -2 -1 0 -1 1 0 0 1 0 3 非常感谢你的帮助 最接近的解决方案似乎无法“逐个元素”完成任务。当然,它会执行另一个操作,但通用概念是“使用在该列上计算的值在每列上执行一个操作”,使用awk分两次执行: awk ' NR==FNR { for (i=1;i<=NF;i++) { a[i]+=$i } next } {

我有一个如下文件(但有数千行和数百列)

如何使用awk将其平均值减去每列/字段,以获得这样的结果

-1 0 -2
-1 0 -1
 1 0  0
 1 0  3
非常感谢你的帮助


最接近的解决方案似乎无法“逐个元素”完成任务。当然,它会执行另一个操作,但通用概念是“使用在该列上计算的值在每列上执行一个操作”

,使用
awk
分两次执行:

awk '
NR==FNR {
    for (i=1;i<=NF;i++) {
        a[i]+=$i
    }
    next
} 
{
    for (y=1;y<=NF;y++) {
        printf "%2d ", $y-=(a[y]/(NR-FNR)) 
    }
    print "" 
}' file file

两次通过
awk

awk '
NR==FNR {
    for (i=1;i<=NF;i++) {
        a[i]+=$i
    }
    next
} 
{
    for (y=1;y<=NF;y++) {
        printf "%2d ", $y-=(a[y]/(NR-FNR)) 
    }
    print "" 
}' file file
用法:python script.py inputFile


用法:python script.py inputFile

感谢您的快速回答。是否有一种方法可以在“NF”列上自动执行此操作?@leonardvertighel将此解决方案更新为通用解决方案。非常感谢!我花了一分钟的时间来弄清楚为什么同一个输入文件有两次,为什么我有很多零:这是出于我的需要将格式“%2d”更改为“%2f”。@leonardvertighel创建两个输入文件的原因是因为我们分两次执行此操作。在第一次过程中,我们将捕获每列的总数,然后在第二次过程中,我们将从每列值中减去平均值。是的,这就是printf的妙处。您可以自定义输出的格式。:)@leonardvertighel我添加了一个替代解决方案,可以在一个过程中完成同样的操作。感谢您的快速回答。是否有一种方法可以在“NF”列上自动执行此操作?@leonardvertighel将此解决方案更新为通用解决方案。非常感谢!我花了一分钟的时间来弄清楚为什么同一个输入文件有两次,为什么我有很多零:这是出于我的需要将格式“%2d”更改为“%2f”。@leonardvertighel创建两个输入文件的原因是因为我们分两次执行此操作。在第一次过程中,我们将捕获每列的总数,然后在第二次过程中,我们将从每列值中减去平均值。是的,这就是printf的妙处。您可以自定义输出的格式。:)@leonardvertighel我添加了一个替代解决方案,可以在一个过程中完成同样的操作。
awk '{
    for (i=1;i<=NF;i++) {
        a[i]+=$i; 
        b[NR,i]=$i
    }
} 
END {
    for (i=1;i<=NR;i++) { 
        for (j=1;j<=NF;j++) {
            printf "%2d ",b[i,j]-=(a[j]/NR)
        }
        print ""
    } 
}' file
import sys, numpy as np
a = np.array([i.strip().split() for i in open(sys.argv[1])],dtype =float)
for i in a - np.mean(a,axis=0): print ' '.join(map(str, i))