Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3024159
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-14 16:03:28

aaa 1
aaa 3
ccc 12
aaa 8
bbb 89
ccc 16
eee 12
ccc 11
eee 13
fff 16
ddd 56

要求对以上文本按第一列的名称进行第2列的求和,并且按升序排列打印。

 

  1. awk '{a[$1]+=$2}END{for(i in a){print i,a[i]}}' file
  2. aaa 12
  3. ccc 39
  4. eee 25
  5. bbb 89
  6. ddd 56
  7. fff 16

[解析]
  把$1为下标,把$2的值累加到以$1为下标的数组a的值上,然后用for(i in a)这最普通的常用的方式取出数组中的下标和其对应的值,但是这种方式是随机取出的。怎么能达到升顺输出呢?我们看下面的例子。

 

  1. awk '{a[$1]+=$2}END{l=asorti(a,b);for(i=1;i<=l;i++){print b[i],a[b[i]]}}' file
  2. aaa 12
  3. bbb 89
  4. ccc 39
  5. ddd 56
  6. eee 25
  7. fff 16
[解析]
  第一部分操作和上句一样,只是后面增加了awk的内置排序的函数asorti,然后通过for循环顺序依次取出a数组的下标和对应的值。
阅读(2363) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~