初學awk陣列會遇到的幾個常見問題

2021-09-20 16:22:21 字數 4056 閱讀 3943

答案的詳細講解請參考:

檔案內容:1

要求結果:

12

3

***.etiantian.org 1

post.etiantian.org 2

www.etiantian.org 3

答案:

1

awk-f"/+"'end'url.txt|sort-rnk2

我們結合這道題來看一下。

首先明確我們的目標,我們要什麼結果?

這裡我們簡化問題,把目標簡化為統計www,***.post重複了幾次,讀者可以自行調整,並統計

www.etiantian.org,***.etiantian.org, post.etiantian.org這幾個網域名稱。

如果出現www則用a記錄下www的重複數量,如果***出現則用b記錄下***的重複數量,如果出現post則通過c記錄下post的重複數量。

答案如下:

1

[root@oldboy32-vm1files]#awk -f "[/]+"'$2~/www/$2~/***/$2~/post/end' url.txt

演示過程:

1

2

[root@showawkfile]#  awk -f "[/]+"'$2~/www/$2~/***/$2~/post/end' url.txt

www:3 ***:1 post:2

雖然這樣很容易理解,因為這裡只有三種網域名稱www,post,***的,一般工作上會有很多個網域名稱,你就會瘋了。

所以我們想要乙個方法,乙個東西(乙個名字)可以裝下這三種情況,並且互相不影響。

這個東西就是我們說的陣列(酒店),這三個情況就是我們說的陣列裡面的元素(酒店房間)。

還是剛才的思路,分三種情況,把不同的情況,這次是放入酒店的三個房間中。 1

2

[root@show awkfile]#awk -f "[/]+" '$2~/www/$2~/***/$2~/post/end' url.txt

3 1 2

12

3

4

[root@show awkfile]#awk 'begin'

2 2

[root@show awkfile]#awk 'begin'

1 2

上面的例子就是如果不加上雙引號,awk會認為是變數。

還是很麻煩怎麼解決呢?

有什麼方法讓遇到相同的內容就進入相同的房間嗎?

如果遇到www自動進入www房間

如果遇到***自動進入***房間

如果遇到post自動進入post房間

可以的,思考一下我們如何通過awk得到www或***或post的呢?

他們都是第二列!awk中可以用$2表示。

所以,這個陣列就可以寫為。

h[$2]++即可,自動對號入座,對號入座後進行自加的操作(自動加1)。 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

[root@show awkfile]#awk -f "[/.]+" '' url.txt

1

2

2

2

3

3

[root@show awkfile]#awk -f "[/.]+" ''url.txt

www:1 ***: post:

www:2 ***: post:

www:2 ***: post:1

www:2 ***:1 post:1

www:3 ***:1 post:1

www:3 ***:1 post:2

這樣雖然可以看到我們想要的結果,但是也顯示出了執行過程,我們只想要結果呀!

只要最後的結果可以通過end模式來解決。 1

2

[root@show awkfile]#awk -f "[/.]+" 'end'url.txt

www:3 ***:1 post:2

這是乙個房間乙個房間的把內容顯示出來,還是那句話當房間很多很多的時候,你又瘋了。

awk自然有解決這個問題的方法,專用的迴圈。 1

2

3

4

[root@show awkfile]#awk -f "[/.]+" 'end' url.txt

www 3

*** 1

post 2

他可以進行比較複雜的計算,當然也可以完成我們最常用的統計(去重)。

如果不用$2,作為房間號碼,我們就需要手動來指定房間,這將是個噩夢。

$2正好可以表示www,***,post這幾個內容。當然也涉及到了之前的知識,選擇合適的刀,切出你想要的東西。

awk陣列進行統計計數(去重)

awk陣列進行累加(計算總和)

vuex初學者會遇到的幾個問題總結

不學還真不行,不學就無法實現兄弟元件間資料訪問學了之後能夠把私有資料公有化,公有化之後所有的元件都能夠訪問這部分資料這就是vuex的作用管理共享資料 簡單來說,就是管理共享資料,而且能夠實時更新 作為乙個初學者,學到這幾個單詞會有點迷糊,傻傻分不太清楚如何去使用他們,接下來用 來演示 import ...

C 初學者容易遇到的幾個錯誤

最近要用到visual c 來開發一些程式,呵呵 以前上學的時候學的是c 對visual c 不是很了解,基本是從頭學起啊,為了以後,便於總結,寫下一些,除錯手冊,便於總結 第乙個錯誤 故意注釋掉 include stdafx.h fatal error c1010 unexpected end o...

初學嵌入式遇到的幾個問題

1 rvds編譯選項中的ro base rw base entry point有何作用?arm映象檔案分為ro 唯讀 rw 讀寫 和zi 零初始化 三個部分。這三個部分的位址又分為兩種,載入時位址和執行時位址。編譯選項中的ro rw確定了映像檔案由flash載入到記憶體中各部分的起始位址,即執行時位...