我有一个如下文件(但有数千行和数百列)
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似乎不是“逐个元素”地完成工作。当然它执行另一个操作,但通用概念是“使用在该列上计算的值对每列执行操作”
答案 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