我有一个包含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
这只打印前两列。我需要添加并打印所有列。
答案 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