场景】--类似于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