2013-06-10 3 views
1

내가 같은 파일이 다음과 같은 (그러나 수천 개의 행과 열 수백)어떻게 각 열을 awk를 사용하여 빼기를 할 수 있습니까?

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은 "요소별로"작업을 수행하지 않는 것 같습니다. 물론 다른 동작을 수행하지만, 일반적인 개념은 두 패스 awk 함께

답변

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 '{ 
    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 
+0

빠른 답변 주셔서 감사합니다. _ "NF"_ columns에서 자동으로 수행하는 방법이 있습니까? –

+0

@leonardvertighel 솔루션이 일반화되도록 업데이트되었습니다. –

+0

대단히 감사합니다! 왜 두 번 같은 입력 파일을 왜 사용했는지, 그리고 왜 제로가 많았는지 알아 내기 위해 "% 2d"형식으로 "% 2f"로 바꿨습니다. –

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

사용법 : 파이썬 script.py 입력 _

관련 문제