2014-01-15 3 views
3

나는 그 안에 n 개의 열이있는 파일을 가지고 있습니다. 동일한 column1 값을 갖는 열을 합쳐서 인쇄해야합니다. 모든 열은 첫 번째 열을 제외한 숫자입니다. 예를groupby/첫 번째 열의 모든 열을 동일하게 일치 awk

은 File2.txt

col1 col2 col3 ... colN 
val1 3000 1000 ... 5000 
val2 3000 1000 ... 5000 
val1 1000 2000 ... 3000 

예상 출력 :

col1 col2 col3 ... colN 
val1 4000 3000 ... 8000 
val2 3000 1000 ... 5000 

나는 시도했다 :이 내용은 처음 두 개의 열을 인쇄

awk '{sums[$1] += $2} END { for (i in sums) printf("%s %s\n", i, sums[i])}' file1.txt | sort 

. 모든 열을 추가하고 인쇄해야합니다.

+0

정확하게 올바른 생각 일 수 있지만 모든 분야를 반복 할 필요가 있습니다. 1 장. '$ 1'의 값과 필드 번호에 기반한 배열 인덱스를 가지려면'sum [$ 1, i]'(루프 변수가 i라고 가정)을 사용할 수 있습니다. 그렇다면 END 루프는 1에서 X까지 걸어야 할 것입니다. (어떤 점에서 NF를 저장하고 모든 줄이 동일한 길이라고 가정하면) 순차 필드를 인쇄하십시오. –

답변

5

이 작동합니다 :

awk 'NR==1{print;next} 
    {b[$1];for(i=2;i<=NF;i++)a[$1,i]+=$i} 
    END{for(x in b){ 
      printf "%s ",x; 
      for(i=2;i<=NF;i++) 
       printf "%s" (i==NF?"\n":" "),a[x,i]}}' file 

를 데이터로 : 당신의 GNU의 AWK 버전 이상이면

kent$ cat f 
col1 col2 col3 colN 
val1 3000 1000 5000 
val2 3000 1000 5000 
val1 1000 2000 3000 

kent$ awk 'NR==1{print;next} 
     {b[$1];for(i=2;i<=NF;i++)a[$1,i]+=$i} 
     END{for(x in b){printf "%s ",x; 
         for(i=2;i<=NF;i++) 
          printf "%s" (i==NF?"\n":" "),a[x,i]}}' f 
col1 col2 col3 colN 
val1 4000 3000 8000 
val2 3000 1000 5000 
+0

감사합니다. Kent, 결과 파일에서 약간의 예상치 못한 형식으로 작업했습니다. 값이 "42713877753"인 열은 "4.27139e + 10"으로 포맷됩니다. 열 값을 그대로 유지하려면 열 값을 그대로 유지하고 싶습니다. 어떤 생각? – Tufail

+0

안녕하세요 켄트, 감사합니다! % s 대신 % d을 (를) 배치하여 올바른 서식을 얻었습니다. 이것에 대한 당신의 도움을 감사하십시오. – Tufail

+0

@ user2964290, http://stackoverflow.com/help/someone-answers –

2

arrays of arrays에 의해 awk가 사용하는 날 것으로 보인다 4.1

awk 'NR==1{print;next} 
{for (i=2;i<=NF;i++) a[$1][i]+=$i} 
END { for (i in a) 
     { printf i 
      for (j=2;j<=length(a[i])+1;j++) 
       printf FS a[i][j] 
      printf RS 
     } 
    }' file 
관련 문제