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

2021-06-18 18:41:27 字數 3779 閱讀 1421

awk的內部變數的個數不多,在這裡介紹的時候就不按照字母順序排列了,而是按相關性分類說明。

argc

argc表示命令行上除了選項-f,-v,-f等選項及其所對應的引數之外的所有引數的個數。如果將「awk程式」直接寫在命令列上,那麼argc是不會把「awk程式」計算在內的。

argv

argv是乙個資料,用來記錄命令列上的引數的名稱。 執行下列命令:

[root@myfreelinux pub]# awk 『begin』 inte integer

argc=3

argv[0]=awk

argv[1]=inte

argv[2]=integer

需要注意當argc = 3 時,命令列上只指定了2 個檔案。

awk的引數-f/t 表示以tab 為字段分隔字元fs(field seporator);-v a=8 是用以初始化程式中的變數。

filename

filename用來表示目前正在處理的檔名。

fs域分隔字元

$0 表示目前awk所讀入的資料行的內容,$1,$2…示所讀入的資料行經過fs指定分割符分割後的第一域,第二域…的記過。

說明:當awk讀入一行資料行」a123  8:15″ 時,會先以$0 記錄,即$0 = 「a123  8:15″,如果程式中進一步使用了$1,$2…或 nf等內部變數時,awk才會自動分割 $0,以便取得各域的資料。 切割後各個域的資料會分別用$1,$2, $3…等儲存。

awk預設的(default)域分隔字元(fs)為空白字元(空格及tab)。以上例來說,如果沒有改變fs的值,那麼分割後:第乙個域($1)=」a123″,第二個域($2)=」8:15″。也可以使用正規表示式來定義fs,比如fs=/[ /t:]+/,表示0或多個空格、tab、:分別或他們三個任意組合成的字串作為分割符,awk每次需要分割資料行時,就會參考目前fs的值。 那麼這定fs後,$0 = 「a123  8:15″,將被分割為,第乙個域($1) = 「a123″,第二個域($2) = 「8″,第三個域($3) = 「15″。

nr (number record)

nr表示awk 開始執行該程式後所讀取的資料行數。

fnr (file number record)

fnr 與nr功用類似;不同的是awk在處理多個資料檔案的時候,每開啟乙個新的檔案,fnr便從0重新累計,而nr是一直累加,看個列子更直觀些,見下列:

[root@myfreelinux pub]# cat inte

123324

[root@myfreelinux pub]# cat integer

222 111

333 111

444 111

[root@myfreelinux pub]# awk 『begin』 inte integer

0 0[root@myfreelinux pub]# awk 『』 inte integer

1 1 123

2 2 324

3 1 222 111

4 2 333 111

5 36 4 444 111

nf(number field)

nf表示當前行被域分隔符分割成的域的個數。awk 每讀入一筆資料後,在程式中用nf記錄該行資料報含的域的個數。在下一行資料被讀入之前,nf不會改變。但如果使用$0來記錄資料,例如:使用getline,此時nf將代表新的$0上資料的域的個數。

ofs (output file separate)

ofs輸出分隔字元。預設是」 「(乙個空白)

ors(output record separate)

ors輸出資料分隔字元。預設值是」/n」(換行符)。

ofmt(output format)

ofmt數值資料的輸出格式。預設值」%.6g」(若須要時最多印出6位小數)。

當使用print指令一次列印出多項資料時,例如:print $1,$2,輸出時,awk會自動在$1與$2之間補上乙個域分隔符的值(ofs 之值);每次使用print輸出後,awk會自動補上h行分隔符的值(ors 之值)。使用print 輸出數值資料時,awk將採用 ofmt 之值為輸出格式。例如:

[root@myfreelinux pub]# awk 『begin』

0.666667

0.67:1

程式中通過改變ofs和ofmt的值,改變了指令print的輸出格式。

rs

rs( record separator) :awk從檔案上讀取資料時,將根據rs的定義把資料切割成許多records,awk一次唯讀入乙個record進行處理。rs 的預設值是換行符」/n」,所以一般awk一次僅讀入一行資料。有時乙個record含括了幾行資料(multi-line record),這情況下不能再以」/n」 來分隔相鄰的records,可改用空白行來分隔,即令rs = 「」,表示以空白行來分隔相鄰的records。 

rstart

rstart與使用字串函式match( )有關的變數,是匹配的字元的開始的位置。

rlength

rlength與使用字串函式match( )有關的變數,rlength是匹配的字串的長度。當使用match() 函式後,awk會將match() 執行的結果以rstart和rlength記錄。看下面的例子:

[root@myfreelinux pub]# awk 『begin』

2 2[root@myfreelinux pub]# awk 『begin』

2 4[root@myfreelinux pub]# awk 『begin』

3 4subsep

subsep(subscript separator) 陣列下標的分隔字元,預設值為」/034″實際上,awk中的陣列只接受字串當它的下標,比如:  arr["john"]。但awk中仍然可使用數字當陣列的下標,甚至可使用多維的陣列(multi-dimenisional array),比 如:arr[2,20]。事實上,awk在接受arr[2,20]之前,就已先把其下標轉換成字串」2/03420″,之後便以arr["2/03420"] 代替arr[2,20]。可參考下例:

[root@myfreelinux pub]# awk 『begin』

1313

13再看下面這個例子,統計每門課有幾個學生選修,用課程名稱作為陣列的下標:

[root@myfreelinux pub]# cat kecheng.dat

zhangsan math english chinese

lisi     computer chinese english

wangwu dianzi chinese math

zhaoliu huanjing english chinese

[root@myfreelinux pub]# cat kecheng.awk

#!/bin/awk -f

end[root@myfreelinux pub]# awk -f kecheng.awk kecheng.dat

computer 1

english 3

dianzi 1

chinese 4

math 2

huanjing 1

awk的使用 第十三部分 awk的字串和數學函式

awk 的內建函式 built in functions 一 字串函式 語法 index 原字串,尋找的子字串 解釋 若原字串中含有欲找尋的子字串,則返回該子字串在原字串中第一次出現的位置,如果沒有出現該子字串則返回0。例如執行 root myfreelinux pub awk begin 5 是返...

awk的使用 第十一部分 awk中常用的模式

awk 通過判斷模式 pattern 的值來決定是否執行其後對應的動作 actions 首先來看一下awk中幾個常見的模式,在前十部分中,有一些模式已經做了介紹,在這裡再總結一下 1 begin是awk 的保留字,是一種特殊的模式。begin 成立 其值為true 的時機是 awk 程式一開始執行,...

awk的使用 第十三部分 awk的字串和數學函式

awk 的內建函式 built in functions 一 字串函式 語法 index 原字串,尋找的子字串 解釋 若原字串中含有欲找尋的子字串,則返回該子字串在原字串中第一次出現的位置,如果沒有出現該子字串則返回0。例如執行 root myfreelinux pub awk begin 5 是返...