awk的使用 第4部分 在awk中使用陣列

2021-06-18 18:39:19 字數 2483 閱讀 1362

awk程式中允許使用字串當做陣列的下標(index),這個特點有助於資料的統計。(使用字串當下標的陣列稱為associative  array)

首先建立乙個名為kecheng.dat資料檔案,內容是學生選課的內容;第一欄為學生姓名,其後為該生所學課程,內容如下:

[root@benet pub]# cat kecheng.dat

zhangsan math english chinese

lisi     computer chinese english

wangwu dianzi chinese math

zhaoliu huanjing english chinese

awk中陣列不需要宣告,也不用指定陣列的大小,直接使用字串當陣列的下標(index)。 以上邊學生選課為資料檔案統計一下kecheng.dat 中學習各門課程的人數。

這種情況,有二項資訊必須儲存: (a) 課程名稱, 如:math,english,共有哪些課程事先並不明確。 (b)各課程的選修人數。 如: 有幾個人選修了「math」。

在awk 中只用乙個陣列就可同時記錄上述資訊。 方法如下:使用陣列number[ ]:以課程名稱當number[ ]的下標。 以number[ ] 中不同下標所對映的元素代表各門課程的人數。 例如:有2個學生學習「math」,則以number["math"]=2表示。如果學習math的人數增加一人,則number[「math」]=number[「math」]+1 或number[「math」]++ 將學習該門課程的人數加1。

那麼如何讀出陣列中儲存的資訊呢?以math為例,宣告int arr[100]陣列後,如果想顯示陣列中的數值,使用乙個for迴圈就可以了,如:for(i=0; i<100; i++) printf(「%d/n」, arr[i]); 即可。上式中:陣列arr[ ] 的下標 :0,1,2,…,99, 陣列arr[ ] 中各下標所對應的值:arr[0],arr[1],…,arr[99]。

上面說了awk 中使用陣列不須宣告,以陣列number為例,程式執行前,並不知有哪些課程名稱可能被當成number[ ]的下標。在awk中提供了乙個指令,通過該指令awk會自動找尋陣列中所有使用過的下標。以number[ ] 為例,awk將會找到「math」,「english」,使用該指令時,只要首先指定要找尋的陣列和變數即可,awk會記錄從陣列中找到的每乙個下標。

例如:for(course in number)

指定使用course 來記錄awk 從number[ ]中找到的下標,awk每找到乙個下標,就用course記錄該下標的值且執行中的指令。

例子:統計kecheng.dat中每門課程有多少學生學習,並輸出結果。

處理方法:建立使用awk編寫的指令碼程式,指令碼的內容如下:

[root@benet pub]# cat course.awk

#!/bin/awk -f

begin

}end

在程式中需要注意,awk程式主要有三部分組成,begin,**處理部分和end三個部分,begin和end是awk的保留字,後面必須是「指令。

第乙個pattern 指令中的fs上面已經說過了,後面跟著分隔資料檔案的分隔符,在這裡,是以空格來進行分隔資料行的沒乙個部分的,所以fs=」 「;如果是分隔/etc/passwd這個檔案,那麼fs=」:」,在以後分隔資料檔案的時候,一定要選擇正確的域分隔符,並用fs進行設定。

第二個pattern 指令中省略了pattern 部分,所以每行資料讀入後,都會在actions部分將逐次無條件執行。awk在讀入第一行資料zhangsan math english chinese的時候,因為該行資料有nf=4個字段,所以action 的for迴圈中i從2開始,因為第乙個欄位是學生的名字,不用進行統計;而其後的各個域需要統計,所以for迴圈中i取值為2,3,4。number[$i]++ 這句中,在i=2時,$2是第二個域的值,即$2=math,number[math]的值從預設的0,++變成了1 ; i=3時$i=english,number[english]的值預設是0,++變成了1 ; 同理,i=4時 $i=chinese,number[chinese]的值從預設的0,++後變成了1 ;   第一行資料處理完後,再次讀入下一行,根據$i的內容,如果陣列中沒有,就會新新增乙個課程,並將選擇給課程的學生數加1,如果該課程在陣列中已經存在,只將改課程的人數加1。

第三個pattern指令中end 為awk的保留字,而且必須是大寫,是pattern的一種。end 成立(其值為true)的條件是: 「awk處理完所有資料,即將離開程式時」,平常讀入資料行時,end並不成立,所以end後面的actions 並不被執行;只有當awk讀完所有資料時,actions才會被執行。

begin與end 有點類似,是awk 中另乙個保留的pattern。 唯一不同的是:「以begin 為pattern的actions 在程式一開始的時候被執行一次」, nf 為awk 的內建變數,用來表示awk正在處理的資料行中所包含的字段的個數。  

awk程式中以$開頭的變數, 都是下面這種意思:以i= 2 為例,$i=$2 表示第二個字段資料(實際上,$在awk 中 為一運算子(operator),用以取得字段資料)。

awk使用 第7部分 awk對多行資料的處理例項

awk 每次從資料檔案中只讀取一行資料進行處理,這是因為awk中有乙個內建變數rs record separator rs將檔案中的資料分隔成以行為單位的記錄record。rs預設值以 n 跳行符號 分隔資料檔案中的資訊,所以預設情況下awk 中一行資料就是一行record。但有些檔案中一行reco...

awk的使用 第二部分 awk的執行方式

在linux unix 的命令列上輸入一下格式的指令 表shell命令列上 的提示符號 awk awk程式 資料檔名 上面這條語句中,awk會先編譯該程式,然後執行該程式來處理所指定的資料檔案。awk程式的主要結構 awk程式中主要語法是 pattern 即模式,所以常見的awk 程式的機構如下 p...

awk的使用 第十四部分 awk的內部變數

awk的內部變數的個數不多,在這裡介紹的時候就不按照字母順序排列了,而是按相關性分類說明。argc argc表示命令行上除了選項 f,v,f等選項及其所對應的引數之外的所有引數的個數。如果將 awk程式 直接寫在命令列上,那麼argc是不會把 awk程式 計算在內的。argv argv是乙個資料,用...