groupby / sum第一列中的所有列都相同awk

时间:2014-01-15 14:29:29

标签: awk

我有一个包含n列的文件(不知道提前有多少列)。我需要对具有相同column1值的列进行求和并打印它们。除第一列外,所有列均为数字。例如

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 

这只打印前两列。我需要添加并打印所有列。

2 个答案:

答案 0 :(得分:6)

这应该有效:

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

答案 1 :(得分:2)

如果您的GNU awk高于4.1版,则使用arrays of arrays的awk

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