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

时间:2013-06-10 02:55:17

标签: awk mean

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

1 2 1
1 2 2
3 2 3
3 2 6

如何使用awk减去每个列/字段的平均值,以获得这样的东西?

-1 0 -2
-1 0 -1
 1 0  0
 1 0  3

非常感谢你的帮助。

最接近的解决方案http://www.unix.com/shell-programming-scripting/102293-normalize-dataset-awk.html似乎不是“逐个元素”地完成工作。当然它执行另一个操作,但通用概念是“使用在该列上计算的值对每列执行操作”

2 个答案:

答案 0 :(得分:4)

两次通过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 '{
    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

答案 1 :(得分:0)

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))

用法:python script.py inputFile