Chinaunix

标题: awk 标签 列求和 [打印本页]

作者: 莫侠007    时间: 2014-11-27 14:16
标题: awk 标签 列求和
原始文本:
QPS   Commit Rollback   TPS    Threads_con Threads_run
1        0        0       0        31         1
14      0        0       0        31         1
15      0        0       0        31         1
45      0        0       0        31         1
1       0        0       0        31         1
1       0        0       0        31         1
1       0        0       0        31         1
1       0        0       0        31         1
15      0        0       0        31         1
要求输出:
QPS  93
Commit 0
Rollback 0
TPS  0
Threads_con 310
Threads_run 10
结果就是第一列当标签:从第二行后 列求和
作者: 莫侠007    时间: 2014-11-27 14:22
回复 1# 莫侠007

我想到的笨方法是:
awk '{if(NR>2){s1=s1+$1;s2=s2+$2;s5=s5+$5}} END {print "QPS",s1"\n""Commit",s2"\n""Threads_run",s5}' /data/logs/zabbix/mysql_status.log
能不能写个循环?

   
作者: super皮波    时间: 2014-11-27 14:38
awk 'NR==1{for(i=1;i<=NF;i++)Tab[i]=$i}{for(i=1;i<=NF;i++)result[i]+=$i} END{for(i=1;i<=NF;i++)print Tab[i],result[i]}'
作者: zxy877298415    时间: 2014-11-27 14:43
[ 本帖最后由 zxy877298415 于 2014-11-27 14:49 编辑 ]

awk 'NR==1{for (i=1;i<=NF;i++) a[i]=$i}FNR>1&&NR>FNR{for (i=1;i<=NF;i++) b[i]+=$i}END{for (i=1;i<=NF;i++) print a[i]":"b[i]}' file file
PS:94
Commit:0
Rollback:0
TPS:0
Threads_con:279
Threads_run:9


   
作者: super皮波    时间: 2014-11-27 14:46
回复 4# zxy877298415
我自己测试过了,我这个是基于一个文件的
awk 'NR==1{for(i=1;i<=NF;i++)Tab=$i}{for(i=1;i<=NF;i++)result+=$i} END{for(i=1;i<=NF;i++)print Tab,result}' 111
QPS 94
Commit 0
Rollback 0
TPS 0
Threads_con 279
Threads_run 9



   
作者: 莫侠007    时间: 2014-11-27 14:46
回复 4# zxy877298415

不好意思 我文本贴少了一行

   
作者: zxy877298415    时间: 2014-11-27 14:46
回复 5# super皮波
恩,那我的多余了


   
作者: super皮波    时间: 2014-11-27 14:48
回复 7# zxy877298415
楼主的就是一个文本


   
作者: 关阴月飞    时间: 2014-11-27 14:50
  1. awk 'NR==1{for(i=0;i++<NF;)a[i]=$i;next}{for(i=0;i++<NF;)b[i]+=$i}END{for(i=0;i++<NF;)print a[i],b[i]}'  urfile
复制代码

作者: 莫侠007    时间: 2014-11-27 14:57
本帖最后由 莫侠007 于 2014-11-27 15:17 编辑

回复 5# super皮波
Tab=$i 不是数组了,Tab=$i才对 你上面写的


会自动把Tab[ i ]变成了 Tab


   
作者: super皮波    时间: 2014-11-27 15:05
回复 10# 莫侠007
看我2楼,5楼的没复制好

   
作者: 莫侠007    时间: 2014-11-27 15:14
本帖最后由 莫侠007 于 2014-11-27 15:15 编辑

谢谢大家,
作者: 莫侠007    时间: 2014-11-27 15:22
回复 9# 关阴月飞
用next是个好习惯


   
作者: jason680    时间: 2014-11-27 15:36
回复 1# 莫侠007

other idea ...

$ awk '{for(n=1;n<=NF;n++){N=(NR==1);a[N,n]=(N==1)?$n:a[N,n]+$n}}END{for(n=1;n<=NF;n++)print a[1,n],a[0,n]}' FILE
QPS 94
Commit 0
Rollback 0
TPS 0
Threads_con 279
Threads_run 9

   
作者: 莫侠007    时间: 2014-11-27 15:47
回复 14# jason680
三元操作符


   
作者: chengchow    时间: 2014-11-27 16:59
  1. gentoo scripts # awk  'NR>1{for(i=1;i<=NF;i++){a[i]+=$i}}NR==1{for(i=1;i<=NF;i++){b[i]=$i}}END{for(i=1;i<=NF;i++){print b[i],a[i]}}' a
  2. QPS 94
  3. Commit 0
  4. Rollback 0
  5. TPS 0
  6. Threads_con 279
  7. Threads_run 9
复制代码

作者: reyleon    时间: 2014-11-27 17:36

大众的方法
  1. awk 'NR==1{for(i=1;i<=NF;i++)a[i]=$i;next}{for(i=1;i<=NF;i++)b[i]+=$i}END{for(i in b)print a[i],b[i]}'
复制代码

作者: ch_hoho    时间: 2014-11-27 21:09
awk  'NR==1{for(i=1;i<=NF;i++)b[i]=$i;}NR>1{for(j=1;j<=NF;j++)a[j]+=$j}END{for(k in b){print b[k],a[k]}}'
最容易想到的
作者: 聆雨淋夜    时间: 2014-11-28 10:15
  1. awk 'NR==1{split($0,a," ");next}{for(i=0;i++<NF;)b[i]+=$i}END{for(i in a)print a[i],b[i]}' 1.txt
复制代码

作者: 聆雨淋夜    时间: 2014-11-28 10:21
  1. awk 'NR==1{for(i=0;i++<NF;)a[i]=$i;next}{for(i=0;i++<NF;)b[i]+=$i}END{for(i=0;i++<NF;)print a[i],b[i]}' 1.txt
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2