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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-10-12 22:27:37

文本:
1 2 3 
4 5 6 
7 8 9
10 11 12
1 3 4
1 5 6 
1 7 8
1 10 11
1 12 4

统计出现次数最多的那个数,并打印出这个数所在的行(1出现次数最多,就打印出1所在的行):
1 2 3 
1 3 4
1 5 6 
1 7 8
1 10 11
1 12 4


  1. awk 'BEGIN{while(getline<"file"){for(i=0;i++<NF;){if(++a[$i]>j){k=$i;j=a[$i]}}}}$0~"\\<"k"\\>"' file
[解析]
我不知道还有没有更好的办法,这是我的思路,也证明是成功的。首先在BEGIN中就通过for循环挨着统计每个字段的数量,得出最多的那个数,然后读取每行看是否匹配到这个数字,成功就打印。问题在于平时我们惯用的表达式比如 $0~/[0-9]/ 这样的正则,或者直接是 $0~1 ,我们得出了k变量是出现最多的那个数字,这个值是1,如果用 $0~k 的话会匹配到包含1的数字比如说11,那么就需要锚定划定边界,这里就需要转义了。


  1. awk '{for(i=0;i++<NF;){a[$i]=a[$i]?a[$i]RS$0:$0;if(m<length(a[$i])){m=length(a[$i]);ind=$i}}}END{print a[ind]}' file
[解析]
这个就是把每个字段的值和它对应的行赋值给数组a,最后长度最大的值的输出该数组内容,就是所在的行了。
阅读(1830) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~