Ubuntu awk的字段變量內(nèi)建變量
給大家推薦一款很不錯的Ubuntu awk系統(tǒng)很有學習價值,這里我主要講解Ubuntu awk系統(tǒng)的應用,包括介紹Ubuntu awk知識等方面。如何執(zhí)行Ubuntu awk 于UNIX的命令行上鍵入諸如下列格式的指令: ( "$"表Shell命令行上的提示符號) $Ubuntu awk 'Ubuntu awk程序' 數(shù)據(jù)文件文件名 則Ubuntu awk會先編譯該程序, 然后執(zhí)行該程序來處理所指定的數(shù)據(jù)文件.
(上列方式系直接把程序?qū)懺赨NIX的命令行上)
Ubuntu awk程序的主要結構: Ubuntu awk程序中主要語法是 Pattern { Actions}, 故常見之Ubuntu awk 程序其型態(tài)如下 :
- Pattern1 { Actions1 }
- Pattern2 { Actions2 }
- Pattern3 { Actions3 }
Pattern 是什么 ? Ubuntu awk 可接受許多不同型態(tài)的 Pattern. 一般常使用 "關系表達式"(Relational expression) 來當成 Pattern.
例如:
x > 34 是一個Pattern, 判斷變量 x 與 34 是否存在大于的關系. x == y 是一個Pattern, 判斷變量 x 與變量 y 是否存在等于的關系. 上式中 x >34 , x == y 便是典型的Pattern. Ubuntu awk 提供 C 語言中常見的關系運算符(Relational Operators) 如 此外, Ubuntu awk 還提供 ~ (match) 及 !~(not match) 二個關系運算符(注一).
其用法與涵義如下:
若 A 為一字符串, B 為一正則表達式(Regular Expression)A ~ B 判斷 字符串A 中是否 包含 能匹配(match)B表達式的子字符串. A !~ B 判斷 字符串A 中是否 不包含 能匹配(match)B表達式的子字符串.
例如 :
"banana" ~ /an/ 整個是一個Pattern. 因為"banana"中含有可以匹配 /an/ 的子字符串, 故此關系式成立(true),整個Pattern的值也是true. 相關細節(jié)請參考 附錄 A Patterns, 附錄 E Regular Expression (注一:) 有少數(shù)Ubuntu awk論著, 把 ~, !~ 當成另一類的 Operator,并不視為一種 Relational Operator. 本手冊中將這兩個運算符當成一種 Relational Operator.
Actions 是什么?
Actions 是由許多Ubuntu awk指令構成. 而Ubuntu awk的指令與 C 語言中的指令十分類似.
例如 :
Ubuntu awk的 I/O指令 : print, printf( ), getline...Ubuntu awk的 流程控制指令 : if(...){..} else{..}, while(...){...}... (請參考 附錄 B --- "Actions" ) Ubuntu awk 如何處理 Pattern { Actions } ? Ubuntu awk 會先判斷(Evaluate) 該 Pattern 的值, 若 Pattern 判斷后的值為true (或不為0的數(shù)字,或不是空的字符串), 則 Ubuntu awk將執(zhí)行該 Pattern 所對應的 Actions.反之, 若 Pattern 之值不為 true, 則Ubuntu awk將不執(zhí)行該 Pattern所對應的 Actions.
例如 : 若Ubuntu awk程序中有下列兩指令
50 > 23 {print "Hello! The word!!" } "banana" ~ /123/ { print "Good morning !" } Ubuntu awk會先判斷 50 >23 是否成立. 因為該式成立, 所以Ubuntu awk將印出"Hello! The word!!". 而另一 Pattern 為 "banana" ~/123/.
因為"banana" 內(nèi)未含有任何子字符串可 match /123/, 該 Pattern 之值為false, 故Ubuntu awk將不會印出 "Good morning !"
Ubuntu awk 如何處理{ Actions } 的語法?(缺少Pattern部分) 有時語法 Pattern { Actions }中, Pattern 部分被省略,只剩 {Actions}.這種情形表示 "無條件執(zhí)行這個 Actions".
Ubuntu awk 的字段變量
Ubuntu awk 所內(nèi)建的字段變量及其涵意如下 : 字段變量含義$0一字符串, 其內(nèi)容為目前 Ubuntu awk 所讀入的數(shù)據(jù)行.$1$0 上第一個字段的數(shù)據(jù).$2$0 上第二個字段的數(shù)據(jù).讀入數(shù)據(jù)行時, Ubuntu awk如何更新(update)這些內(nèi)建的字段變量?
當 Ubuntu awk 從數(shù)據(jù)文件中讀取一個數(shù)據(jù)行時, Ubuntu awk 會使用內(nèi)建變量$0 予以記錄.每當 $0 被改動時 (例如 : 讀入新的數(shù)據(jù)行 或 自行變更 $0,...) Ubuntu awk 會立刻重新分析 $0 的字段情況, 并將 $0 上各字段的數(shù)據(jù)用 $1, $2, ..予以記錄.
Ubuntu awk的內(nèi)建變量(Built-in Variables)
Ubuntu awk 提供了許多內(nèi)建變量, 使用者于程序中可使用這些變量來取得相關信息.常見的內(nèi)建變量有 :
內(nèi)建變量含義
NF (Number of Fields)為一整數(shù), 其值表$0上所存在的字段數(shù)目.NR (Number of Records)為一整數(shù), 其值表Ubuntu awk已讀入的數(shù)據(jù)行數(shù)目.FILENAMEUbuntu awk正在處理的數(shù)據(jù)文件文件名.
例如 : Ubuntu awk 從資料文件 emp.dat 中讀入第一筆數(shù)據(jù)行 "A125 Jenny 100 210" 之后, 程序中:
- $0 之值將是 "A125 Jenny 100 210"
- $1 之值為 "A125"
- $2 之值為 "Jenny"
- $3 之值為 100
- $4 之值為 210
- $NF 之值為 4
- $NR 之值為 1
- $FILENAME 之值為 "emp.dat"
Ubuntu awk的工作流程 :
執(zhí)行Ubuntu awk時, 它會反復進行下列四步驟. 自動從指定的數(shù)據(jù)文件中讀取一個數(shù)據(jù)行. 自動更新(Update)相關的內(nèi)建變量之值. 如 : NF, NR, $0... 依次執(zhí)行程序中 所有 的 Pattern { Actions } 指令.
當執(zhí)行完程序中所有 Pattern { Actions } 時, 若數(shù)據(jù)文件中還有未讀取的數(shù)據(jù), 則反復執(zhí)行步驟1到步驟4. Ubuntu awk會自動重復進行上述4個步驟, 使用者不須于程序中編寫這個循環(huán) (Loop).
打印文件中指定的字段數(shù)據(jù)并加以計算Ubuntu awk 處理數(shù)據(jù)時, 它會自動從數(shù)據(jù)文件中一次讀取一筆記錄, 并會 將該數(shù)據(jù)切分成一個個的字段; 程序中可使用 $1, $2,... 直接取得 各個字段的內(nèi)容. 這個特色讓使用者易于用 Ubuntu awk 編寫 reformatter 來改變量據(jù)格式.
[ 范例 :] 以文件 emp.dat 為例, 計算每人應發(fā)工資并打印報表. [ 分析 :] Ubuntu awk 會自行一次讀入一列數(shù)據(jù), 故程序中僅需告訴 Ubuntu awk 如何處理所讀入的數(shù)據(jù)行. 執(zhí)行如下命令 : ( $ 表UNIX命令行上的提示符 ) $ Ubuntu awk '{ print $2, $3 * $4 }' emp.dat
執(zhí)行結果如下 : 屏幕出現(xiàn) :
- Jenny 21000
- Dan 23650
- Max 27170
- John 27500
- Linda 19950
[ 說明 :] UNIX命令行上, 執(zhí)行Ubuntu awk的語法為: $Ubuntu awk 'Ubuntu awk程序' 欲處理的資料文件文件名本范例中的 程序部分 為 {print $2, $3 * $4}. 把程序置于命令行時, 程序之前后須以 ' 括住. emp.dat 為指定給該程序處理的數(shù)據(jù)文件文件名.
本程序中使用 : Pattern { Actions } 語法.
Pattern 部分被省略, 表無任何限制條件. 故Ubuntu awk讀入每筆數(shù)據(jù)行后都將無條件執(zhí)行這個 Actions. print為Ubuntu awk所提供的輸出指令, 會將數(shù)據(jù)輸出到stdout(屏幕). print 的參數(shù)間彼此以 "," (逗號) 隔開, 印出數(shù)據(jù)時彼此間會以空白隔開. (參考 附錄 D 內(nèi)建變量OFS) 將上述的 程序部分 儲存于文件 pay1.Ubuntu awk 中. 執(zhí)行命令時再指定Ubuntu awk程序文件 之文件名. 這是執(zhí)行Ubuntu awk的另一種方式, 特別適用于程序較大的情況, 其語法如下:
- $ Ubuntu awk -f Ubuntu awk程序文件名 數(shù)據(jù)文件文件名 故執(zhí)行下列兩命令,將產(chǎn)生同樣的結果.
- $ Ubuntu awk -f pay1.Ubuntu awk emp.dat
- $ Ubuntu awk '{ print $2, $3 * $4 }' emp.dat
讀者可使用 "-f" 參數(shù),讓Ubuntu awk主程序使用“其它僅含 Ubuntu awk函數(shù) 的文件中的函數(shù) ”
其語法如下:
$ Ubuntu awk -f Ubuntu awk主程序文件名 -f Ubuntu awk函數(shù)文件名 數(shù)據(jù)文件文件名 (有關 Ubuntu awk 中函數(shù)的聲明與使用于 7.4 中說明) Ubuntu awk中也提供與 C 語言中類似用法的 printf() 函數(shù). 使用該函數(shù)可進一步控制數(shù)據(jù)的輸出格式. 編輯另一個Ubuntu awk程序如下, 并取名為 pay2.Ubuntu awk { printf("%6s Work hours: %3d Pay: %5d"n", $2,$3, $3* $4) }
執(zhí)行下列命令 $Ubuntu awk -f pay2.Ubuntu awk emp.dat 執(zhí)行結果屏幕出現(xiàn):
- Jenny Work hours: 100 Pay: 21000
- Dan Work hours: 110 Pay: 23650
- Max Work hours: 130 Pay: 27170
- John Work hours: 125 Pay: 27500
- Linda Work hours: 95 Pay: 19950
【編輯推薦】