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