2014-01-15 59 views
3

我有一個文件,其中有n列(不知道有多少列預先)。我需要總結具有相同column1值的列並打印它們。除第一列外,所有列都是數字。例如groupby /總結所有列在第一列相同awk

FILE1.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

這在我看來,是完全正確的想法,但你將需要遍歷每一個領域,並做這筆錢爲ea工作一個。你可以使用'sum [$ 1,i]'(假設你的循環變量是i)根據'$ 1'的值和字段號得到一個數組索引。然後你的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 

與您的數據:

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

嗨肯特,謝謝!我通過放置%d而不是%s來獲得正確的格式。感謝您的幫助。 – Tufail

+0

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

2

使用arrays of arrays awk中,如果您的GNU 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 
相關問題