awk对列/行进行统计求和
https://www.cnblogs.com/paul8339/p/9054409.html
场景】--类似于excel中的sum函数对列/行进行统计求和
A01 30 16 9 3 2 30 30 16 9 3 A02 14 6 1 0 7 14 14 6 1 0 A03 4 0 3 0 1 4 0 4 0 3 A09 6 3 0 0 3 6 0 6 3 0
【要求1】--对列进行统计求和
A01 30 16 9 3 2 30 30 16 9 3 A02 14 6 1 0 7 14 14 6 1 0 A03 4 0 3 0 1 4 0 4 0 3 A09 6 3 0 0 3 6 0 6 3 0 TOTAL 54 25 13 3 13 54 44 32 13 6
【要求2】--对行进行统计求和
A01 30 16 9 3 2 30 30 16 9 3 148 A02 14 6 1 0 7 14 14 6 1 0 63 A03 4 0 3 0 1 4 0 4 0 3 19 A09 6 3 0 0 3 6 0 6 3 0 27
代码实现1
[li0924@localhost awk]$ awk '{for(i=2;i<=NF;i++)a[i]+=$i;print}END{printf "TOTAL \t";for(j=2;j<=NF;j++)printf a[j]"\t"; print""}' inputfile A01 30 16 9 3 2 30 30 16 9 3 A02 14 6 1 0 7 14 14 6 1 0 A03 4 0 3 0 1 4 0 4 0 3 A09 6 3 0 0 3 6 0 6 3 0 TOTAL 54 25 13 3 13 54 44 32 13 6
【解析】
把每列的总和用数组a[i]来表示;用for(i=2;i<=NF;i++)来打印每列的总和
代码实现2
[li0924@localhost awk]$ awk '{b[NR]=$0; for(i=2;i<=NF;i++)a[NR]+=$i;}END{for(i=1;i<=NR;i++) print b[i]"\t"a[i]}' inputfile A01 30 16 9 3 2 30 30 16 9 3 148 A02 14 6 1 0 7 14 14 6 1 0 63 A03 4 0 3 0 1 4 0 4 0 3 19 A09 6 3 0 0 3 6 0 6 3 0 27