1

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

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似乎没有“逐个元素”地完成这项工作。当然它执行另一个操作,但通用概念是“使用在该列上计算的值对每一列执行一个操作”

4

2 回答 2

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
于 2013-06-10T03:13:22.017 回答
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

于 2013-06-10T09:28:28.987 回答