1.awk数组
假设我们有一个酒店
酒店<===>Green
酒店里面有几个房间515,516,517,519这几个房间
酒店515房间<===>GreenHotel[515] 酒店516房间<===>GreenHotel[516] 酒店517房间<===>GreenHotel[517] 酒店519房间<===>GreenHotel[519]
酒店房间里面入住客人
酒店515房间住着xiaowei<===>greenhotel[515]="xiaowei" 酒店516房间住着dakai<===>greenhotel[516]="dakai" 酒店517房间住着xiaoguangdong<===>greenhotel[517]="xiaoguangdong" 酒店519房间住着dabaojian<===>greenhotel[519]="dabaojian"
示例:
[root@Da_Kai files]# awk 'BEGIN{greenhotel[515]="xiaowei";greenhotel[516]="dtel[519]="dabaojian";for(hotel in greenhotel)print hotel,green[hotel]}'
516
517
519
515
[root@Da_Kai files]# awk 'BEGIN{greenhotel[515]="xiaowei";greenhotel[516]="dakai";greenhotel[517]="xiaoguangdong";greenhotel[519]="dabaojian";for(hotelin greenhotel)print hotel,greenhotel[hotel]}' 516 dakai 517 xiaoguangdong 519 dabaojian 515 xiaowei
企业面试题1:统计域名访问次数
处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和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
思路:
1)以斜线为菜刀取出第二列(域名)
2)创建一个数组
3)把第二列(域名)作为数组的下标
4)通过类似于i++的形式进行计数
5)统计后把结果输出
过程演示:
第一步:查看一下内容
[root@chensiqi ~]# awk -F "[/]+" '{print $2}' file www.etiantian.org www.etiantian.org post.etiantian.org mp3.etiantian.org www.etiantian.org post.etiantian.org 命令说明: 这是我们需要计数的内容
第二步:计数
[root@chensiqi ~]# awk -F "[/]+" '{i++;print $2,i}' file www.etiantian.org 1 www.etiantian.org 2 post.etiantian.org 3 mp3.etiantian.org 4 www.etiantian.org 5 post.etiantian.org 6 命令说明: i++:i最开始是空的,当awk读取一行,i自身+1
第三步:用数组替换i
[root@chensiqi ~]# awk -F "[/]+" '{h[$2]++;print $2,h["www.etiantian.org"]}' file www.etiantian.org 1 www.etiantian.org 2 post.etiantian.org 2 mp3.etiantian.org 2 www.etiantian.org 3 post.etiantian.org 3 命令说明: 1)将i替换成h[$2];相当于我创建了一个数组h[],然后用$2作为我的房间号。但是目前房间里是没有东西的。也就是说h[$2]=h["www.etiantian.org"] and h["post.etiantian.org"] and h["mp3.etiantian.org"] 但是具体房间里是没有东西的也就是空。 2)h[$2]++就等于i++:也就是说我开始给房间里加东西;当出现同样的东西,我就++ 3)print h[" 4)综上,输出的结果中,每次出现www.etiantian.org时,h["www.etiantian.org"]就会++。因此最后的输出数字是3
第四步:输出最终计数结果
[root@chensiqi ~]# awk -F "[/]+" '{h[$2]++}END{for(i in h)print i,h[i]}' file mp3.etiantian.org 1 post.etiantian.org 2 www.etiantian.org 3 [root@chensiqi ~]# 命令说明: 我们最终需要输出的是去重复以后的统计结果,所以得在END模块里进行输出 for(i in h)遍历这个数组,i里存的都是房间号 print i,h[i]:输出每一个房间号及其房间里的内容(计数结果)
转载于:https://blog.51cto.com/dakaige517/1934045