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]}'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM