首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用awk和sed对数据进行统计

如何使用awk和sed对数据进行统计
EN

Stack Overflow用户
提问于 2015-02-28 15:31:25
回答 1查看 138关注 0票数 0

我有一个原始数据文件,我想要生成一个输出文件,这两个文件都如下所示。生成规则是输出中的第1列等效于原始文件的第2列。输出中的列2是原始数据中最后一列值的平均值,其行是匹配的。例如,输出中的value1是(25+24.3846+13.8972+1.33333+1)/5。

代码语言:javascript
复制
 #Raw data
 4 compiler-compiler  100000 99975  1  25
  4 compiler-compiler  100000 99683  13  24.3846
  4 compiler-compiler  100000 93649  457  13.8972
  4 compiler-compiler  100000 99764  177  1.33333
  4 compiler-compiler  100000 99999  1  1
  4 compiler-sunflow  100000 99999  1  1
  4 compiler-sunflow  100000 99674  11  29.6364
  4 compiler-sunflow  100000 93467  423  15.4444
  4 compiler-sunflow  100000 99694  159  1.92453
  4 compiler-sunflow  100000 99938  4  15.5
  4 compress  100000 99997  1  3
  4 compress  100000 99653  10  34.7
  4 compress  100000 93639  454  14.011
  4 compress  100000 99666  173  1.93064
  4 compress  100000 99978  4  5.5
  4 serial  100000 99998  1  2
  4 serial  100000 99932  6  11.3333
  4 serial  100000 93068  460  15.0696
  4 serial  100000 99264  206  3.57282
  4 serial  100000 99997  3  1
  4 sunflow  100000 99998  1  2
  4 sunflow  100000 99546  18  25.2222
  4 sunflow  100000 93387  481  13.7484
  4 sunflow  100000 99752  189  1.31217
  4 sunflow  100000 99974  4  6.5
  4 xml-transfomer  100000 99994  1  6
  4 xml-transfomer  100000 99964  3  12
  4 xml-transfomer  100000 93621  463  13.7775
  4 xml-transfomer  100000 99540  199  2.31156
  4 xml-transfomer  100000 99986  2  7
  4 xml-validation  100000 99996  1  4
  4 xml-validation  100000 99563  16  27.3125
  4 xml-validation  100000 93748  451  13.8625
  4 xml-validation  100000 99716  190  1.49474
  4 xml-validation  100000 99979  3  7

#Output data
compiler-compiler   value1
....
xml-transfomer      value2
xml-validation      value3 

我认为这个评论可以解决这个问题,但我不知道如何得到它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-28 15:39:43

这里不能使用sed,因为它不支持数学操作。这是awk的工作

代码语言:javascript
复制
awk 'NR>1{c[$2]++;s[$2]+=$(NF)}END{for(i in c){print i,s[i]/c[i]}}' input.txt

解释:

代码语言:javascript
复制
NR>1 { c[$2]++; s[$2+=($NF) }

NR>1意味着在除第一行之外的所有行上执行以下块。$2是第二列的值。NF是每行字段的数目。$(NF)包含最后一列的值。cs是assoc数组。c统计$2出现的次数,c在最后一列中存储数字值的总和--按$2分组。

代码语言:javascript
复制
END {for(i in c){print i,s[i]/c[i]}}

END意味着在处理完最后一行输入后,将执行以下操作。for循环遍历c并输出c中所有索引的名称和平均值。

输出:

代码语言:javascript
复制
xml-validation 10.7339
compiler-compiler 13.123
serial 6.59514
sunflow 9.75655
xml-transfomer 8.21781
compiler-sunflow 12.7011
compress 11.8283

注意,如果使用assoc aray,则会对输出顺序产生影响。如果您关心输出顺序,可以使用以下命令:

代码语言:javascript
复制
awk 'NR>1 && $2!=n && c {print n,t/c;c=t=0} NR>1{n=$2;c++;t+=$(NF)}'

此命令不使用assoc数组,它会在$2更改时及时打印出统计数据--注意这需要按$2排序

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28783405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档