AWK 的內建變數 Built-in Variables
因內建變數的個數不多, 此處按其相關性分類說明, 並未按其字母
順序排列.
- ARGC 表命令列上除了選項 -F, -v, -f 及其所對應的參數之外
的所有參數的個數.若將``AWK程式''直接寫於命令列上,
則 ARGC 亦不將該``程式部分''列入計算.
- ARGV 一個陣列用以記錄命令列上的參數.
例 : 執行下列命令
$awk -F\t -v a=8 -f prg.awk file1.dat file2.dat
或
$awk -F\t -v a=8 '{ print $1 * a }' file1.dat file2.dat
}
執行上列任一程式後
ARGC = 3
ARGV[0] = "awk"
ARGV[1] = "file1.dat"
ARGV[2] = "file2.dat"
讀者請留心 : 當 ARGC = 3 時, 命令列上僅指定 2 個資料檔.
註 :
-F\t 表示以 tab 為欄位分隔字元 FS(field seporator).
-v a=8 是用以 initialize 程式中的變數 a.
- FILENAME 用以表示目前正在處理的資料檔檔名.
*
FS 欄位分隔字元.
$0 表示目前AWK所讀入的資料列.
$1,$2..分別表示所讀入的資料列之第一欄, 第二欄,..
(參考下列說明)
當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".
使用者可用 Regexp 自行定義 FS. AWK每次需要分割資料列時,
會參考目前FS之值.
例如 :
令 FS = "[ :]+" 表示任何由 空白" " 或 ":" 所組成的字串都可當成
分隔字元, 則分割後 :
第一欄($1) = "A123", 第二欄($2) = "8", 第三欄($3) = "15"
- NR 表從 AWK 開始執行該程式後所讀取的資料列數.
- FNR 與 NR 功用類似. 不同的是AWK每開啟一個新的資料檔,
FNR 便從 0 重新累計
- NF表目前的資料列所被切分的欄位數.
AWK 每讀入一筆資料後, 於程式中可以 NF 來得知該筆資料包含
的欄位個數.在下一筆資料被讀入之前, NF 並不會改變. 但使用者
若自行使用$0來記錄資料
例如 : 使用 getline, 此時 NF 將代表新的 $0 上所記載之資料的
欄位個數.
- OFS輸出時的欄位分隔字元. 預設值 " "(一個空白), 詳見下面說明.
- ORS輸出時資料列的分隔字元. 預設值 "\n"(跳行), 見下面說明.
- OFMT數值資料的輸出格式. 預設值 "%.6g"(若須要時最多印出6位小數)
當使用 print 指令一次印出多項資料時,
例如 : print $1, $2
印出資料時, AWK會自動在 $1 與 $2 之間補上一個 OFS 之值
(預設值為 一個空白)
每次使用 print 輸出(印)資料後, AWK會自動補上 ORS 之值.
(預設值為 跳行)
使用 print 輸出(印)數值資料時, AWK將採用 OFMT 之值為
輸出格式.
例如 : print 2/3
AWK 將會印出 0.666667
程式中可藉由改變這些變數之值, 來改變指令 print 的輸出格式.
- RS( Record Separator) : AWK從資料檔上讀取資料時,
將依 RS 之定義把資料切割成許多Records,而AWK一次僅讀入一個
Record,以進行處理.
RS 的預設值是 "\n". 所以一般 AWK一次僅讀入一行資料.
有時一個Record含括了幾列資料(Multi-line Record). 這情況下不能
再以"\n"
來分隔併鄰的Records, 可改用 空白行 來分隔.
在AWK程式中,令 RS = "" 表示以 空白行 來分隔併鄰的Records.
*
- RSTART與使用字串函數 match( )有關之變數,詳見下面說明.
- RLENGTH與使用字串函數match( )有關之變數.
當使用者使用 match(...) 函數後, AWK會將 match(...) 執行的結果以
RSTART,RLENGTH 記錄之.
請參考 附錄 C AWK的內建函數 match().
- SUBSEP(Subscript Separator) 陣列中註標的分隔字元,
預設值為"\034"實際上, AWK中的 陣列 只接受 字串 當它的註標,
如 : Arr["John"].
但使用者在 AWK 中仍可使用 數字 當陣列的註標, 甚至可使用多維的
陣列(Multi-dimenisional Array)
如 : Arr[2,79]
事實上, AWK在接受 Arr[2,79] 之前, 就已先把其註標轉換成字串
"2\03479", 之後便以 Arr["2\03479"] 代替 Arr[2,79].
可參考下例 :
awk 'BEGIN { Arr[2,79] = 78
print Arr[2,79]
print Arr[ 2 , 79 ]
print Arr["2\03479"]
idx = 2 SUBSEP 79
print Arr[idx]
}
' $*
執行結果印出:
78
78
78
78