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]:输出每一个房间号及其房间里的内容(计数结果)