awk數組計數和去重---統計域名訪問次數

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]:輸出每一個房間號及其房間裏的內容(計數結果)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章