awk对一行或者一列求和

cat 234.txt

 


A01,30,16,11,9,3,2,30,30,16,9,3,2
A02,14,6,12,1,0,7,14,,14,6,1,0,5
A03,4,0,11,3,0,,1,4,0,,4,0,3,8
A09,6,3,16,0,0,,3,6,0,6,3,0,6 

 

 

对 各列求和

 

cat 234.txt  | awk -F, '{for(i=2;i<=NF;i++) a[i]+=$i ;print} END{ printf "TOTAL \t"; for(j=2;j<=NF;j++) printf  a[j]","; print""}'    

 

cat 234.txt |awk -F, '{for(i=2;i<=NF;i++) a[i]+=$i ;print} END{ printf "TOTAL \t"; for(j=2;j<=NF;j++) printf a[j]","; print""}'


AA01,30,16,11,9,3,2,30,30,16,9,3,2
AA02,14,6,12,1,0,7,14,,14,6,1,0,5
AA03,4,0,11,3,0,,1,4,0,,4,0,3,8
AA09,6,3,16,0,0,,3,6,0,6,3,0,6


TOTAL 54,25,50,13,3,9,48,40,30,21,11,2,14,

 

把每列的总和用数组a[i]来表示;用for(i=2;i<=NF;i++)来打印每列的总和

 

对各行求和

cat 234.txt |awk -F, '{ sum=0; sum=$2+$3+$4+$5+$6+$7+$8+$9+$10+$11+$12 ;print $0 "\t" sum;}'


AB01,30,16,11,9,3,2,30,30,16,9,3,2 159
AC02,14,6,12,1,0,7,14,,14,6,1,0,5 75
AD03,4,0,11,3,0,,1,4,0,,4,0,3,8 27
AF09,6,3,16,0,0,,3,6,0,6,3,0,6 43

 

 

 

 

 

 

 

分组求和

 

awk '{s[$1] += $2}END{ for(i in s){ print i, s[i] } }' file1 > file2

以第一列 为变量名 第一列为变量,将相同第一列的第二列数据进行累加 打印出和

 

 

awk '{s[$1" "$2] += $3}END{ for(i in s){ print i, s[i] } }' file1 > file2

以第一列和第二列为变量名, 将相同第一列、第二列的第三列数据进行累加 打印出和

 

 

awk '{s[$1] += $2; a[$1] += $3 }END{ for(i in s){ print i,s[i],a[i] } }' haha.txt

如果第一列相同,则根据第一列来分组,分别打印第二列和第三列的和

 

 

awk '{if(/404/)sum[$1]++}END{for (i in sum) print i,sum[i]}' 123.txt

 

 

 

 

取最大值、最小值

 

1、针对(2列的文件)

 

awk '{max[$1]=max[$1]>$2?max[$1]:$2}END{for(i in max)print i,max[i]}'   file

 

第一列不变,取第二列分组最大值

 

awk '{if(!min[$1])min[$1]=20121231235959;min[$1]=min[$1]<$2?min[$1]:$2}END{for(i in min)print i,min[i]}'  file

 第一列不变,取第二列分组最小值

 

2、针对单列的文件

awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}' file2

awk 'BEGIN {min = 1999999} {if ($1<min) min="$1" fi}="" end="" {print="" "min=", min}' file2

  

求和、求平均值、求标准偏差

求和

cat data|awk '{sum+=$1} END {print "Sum = ", sum}'

 

求平均

cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'

 

求标准偏差

cat $FILE | awk -v ave=$ave '{sum+=($1-ave)^2}END{print sqrt(sum/(NR-1))}'

 

整合行和列

1、列换成行

  如果第一列相同,将所有的第二列 第三列 都放到一行里面

 awk '{qq[$1]=qq[$1](" "$2" "$3)}END{for(i in qq)print i,qq[i]}'

posted @ 2021-05-18 20:32  chengxuyonghu  阅读(3626)  评论(0编辑  收藏  举报