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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-11-25 16:58:37

cat file 
a
b
a
c
e
e
a
b
e

要求统计文中字母出现的次数,并按次数降序输出:
  1. awk '{a[$1]++}END{for(i in a)print i,a[i]}' file | sort -k2nr
  2. a 3
  3. e 3
  4. b 2
  5. c 1




文本的关键是如何省略掉管道和sort排序:
  1. awk '{a[++b[$1]]}END{for(i=length(a);i>0;i--)for(j in b)if(b[j]==i)print j,b[j]}' file
[解析]
首先统计字母出现的次数,最后在 END 中利用 asort 对数组a的值进行排序,并把排序结果保存到数组b中。然后开始降序输出用 b[n] 的值判断是否与 a[i] 的值相等,相等就打印出下标和其对应的值,然后从数组a中删除该下标,以免以后的循环再匹配到该下表的值。要是从小到大输出只须更改for循环即可。

阅读(4245) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

英语盲学linux2012-04-25 12:36:40

用数组a来存储b[$1]的值,用来避免b[$1]值不连续的情况,学习了

yangkyo8212012-01-22 13:38:34

既避免管道又避免了排序,真好,学习了