老男孩教育每日一题-2017年3月31日-awk数组统计
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了老男孩教育每日一题-2017年3月31日-awk数组统计相关的知识,希望对你有一定的参考价值。
老男孩教育每日一题-2017年3月31日-awk数组统计
处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
http://www.etiantian.org/index.html http://www.etiantian.org/1.html http://post.etiantian.org/index.html http://mp3.etiantian.org/index.html http://www.etiantian.org/3.html http://post.etiantian.org/2.html
要求结果:
mp3.etiantian.org 1 post.etiantian.org 2 www.etiantian.org 3
思路:
取出域名
以斜线为菜刀取出第二列(域名)
进行加工
创建一个数组
把第二列(域名)作为数组的下标
通过类似于i++的形式进行计算数量
统计后把结果输出
答案:
awk -F "/+" ‘{hotel[$2]++}END{for(pol in hotel) print pol,hotel[pol]}‘ url.txt|sort -rnk2
演示:
[[email protected] awkfile]# awk -F "/+" ‘{hotel[$2]++}END{for(pol in hotel) print pol,hotel[pol]}‘ url.txt|sort -rnk2 www.etiantian.org 3 post.etiantian.org 2 mp3.etiantian.org 1
我们先不要着急整体分析这个结果,我们把这个结果分为几个里程碑逐个击破。
第一个里程碑-取出想要的内容
根据题目要求我们需要取出域名。awk -F "/+" ,需要用到+表示连续的。
[[email protected] awkfile]# awk -F "/+"‘{print $2}‘ url.txt www.etiantian.org www.etiantian.org post.etiantian.org mp3.etiantian.org www.etiantian.org post.etiantian.org
第二个里程碑-创建数组
我们接下来创建数组,数组名字还是hotel,每个元素(房间)
[[email protected] awkfile]# awk -F "/+"‘{hotel[$2]}‘ url.txt ###创建数组 [[email protected] awkfile]# awk -F "/+"‘{hotel[$2];print $2}‘ url.txt ##创建数组,并通过print 输出元素名字(房间号码) www.etiantian.org www.etiantian.org post.etiantian.org mp3.etiantian.org www.etiantian.org post.etiantian.org
第三个里程碑-进行统计
[[email protected] awkfile]# awk -F "/+"‘{hotel[$2]++}‘ url.txt ###创建数组 [[email protected] awkfile]# awk -F "/+"‘{hotel[$2]++;print $2,hotel[$2]}‘ url.txt ##创建数组,并通过print 输出元素名字(房间号码),房间内容 www.etiantian.org 1 www.etiantian.org 2 post.etiantian.org 1 mp3.etiantian.org 1 www.etiantian.org 3 post.etiantian.org 2
$2表示的是每一行的第二列,是一个变量。
hotel[$2]++这种形式类似于前面的i++,只不过把变量i换成了数组hotel[$2],相当于把原来的一个插间的房子,换成了一个公寓楼。
下面我们详细分析下awk如何统计www.etiantian.org重复了多少次。
这里我们只关注www.etiantian.org重复的次数。
读取第一行:
以"/+"连续的/为菜刀,切割$2就是www.etiantian.org,
把他放在数组中就是hotel["www.etiantian.org"],
进行统计 hotel["www.etiantian.org"]=hotel["www.etiantian.org"]+1
hotel酒店中www.etiantian.org房间原来没有东西,可以理解为空的。所以hotel["www.etiantian.org"]=空+1 最后这个房间放入了数字1.
读取第二行:
$2还是www.etiantian.org.
统计就是 hotel["www.etiantian.org"]=hotel["www.etiantian.org"]+1
因为上面我们已经往hotel酒店的www.etiantian.org房间放入数字1,所以现在
hotel["www.etiantian.org"]=1+1hotel酒店www.etiantian.org房间内容应该是2
读取第三行:
不是我们想要的www.etiantian.org所以www.etiantian.org房间内容还是2不会变化。
读取第四行:
$2是mp3.etiantian.org
不是我们想要的www.etiantian.org所以www.etiantian.org房间内容还是2不会变化。
读取第五行:
$2还是www.etiantian.org.
统计就是 hotel["www.etiantian.org"]=hotel["www.etiantian.org"]+1
因为上面我们已经往hotel酒店的www.etiantian.org房间放入数字2,所以现在
hotel["www.etiantian.org"]=2+1hotel酒店www.etiantian.org房间内容应该是3
读取第六行:
$2是post.etiantian.org
不是我们想要的www.etiantian.org所以www.etiantian.org房间内容还是3不会变化。
详细过程表格
只查看hotel["www"]房间的内容
行号 | $2的内容 | hotel["www"]之前的内容 | hotel["www"] = hotel["www"] + 1的过程 | hotel["www"]之后的内容 |
1 | www | 空 | hotel["www"] = 空 + 1 | 1 |
2 | www | 1 | hotel["www"] = 1 + 1 | 2 |
3 | post | 2 | 不是www不进行加1 | 2 |
4 | mp3 | 2 | 不是www不进行加1 | 2 |
5 | www | 2 | hotel["www"] = 2 + 1 | 3 |
6 | post | 3 | 不是www不进行加1 | 3 |
总结:
最终结果是:
[[email protected] awkfile]# awk -F "/+" ‘{hotel[$2]++}END{for(pol in hotel) print pol,hotel[pol]}‘ url.txt|sort -rnk2 www.etiantian.org 3 post.etiantian.org 2 mp3.etiantian.org 1
优化后的结果:
[[email protected] awkfile]# awk -F "/+" ‘{hotel[$2]++}END{for(pol in hotel) print pol,hotel[pol]}‘ url.txt|sort -rnk2|column -t www.etiantian.org 3 post.etiantian.org 2 mp3.etiantian.org 1
可以通过,column 命令让结果优雅一些,比awk的printf方便些。
本文出自 “悠久之翼的博客” 博客,请务必保留此出处http://youjiu.blog.51cto.com/3388056/1912219
以上是关于老男孩教育每日一题-2017年3月31日-awk数组统计的主要内容,如果未能解决你的问题,请参考以下文章
老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式
老男孩教育每日一题-2017年4月5日-统计你的linux系统的history历史记录,得出你最喜欢使用的前10个命令
老男孩教育每日一题-2017年3月22日:请说明用户访问网站流程