AWK中除了>, <, ==, != ,...等關係運算元( Relational
Operators )外,另外提供
~(match),!~(Not Match) 二個關係運算元. 利用這兩個運算元, 可判斷
某字串是否包含能符合所指定 Regular Expression 的子字串.
由於這些特性, 很容易使用AWK來撰寫需要字串比對, 判斷的程式.
[ 範例 :] 承上例,
- 組裝部門員工調薪5%,(組裝部門員工之ID.係以``A''開頭)
- 所有員工最後之薪資率若仍低於100, 則以100計.
- 撰寫AWK程式列印新的員工薪資率報表.
[分析 ] :
這個程式須先判斷所讀入的資料列是否合於指定條件, 再進行
某些動作.AWK中 Pattern { Actions } 的語法已涵蓋這種 `` if ( 條件 )
{ 動作} ''的架構.
編寫如下之程式, 並取名 adjust1.awk
$1 ~ /^A.*/ { $3 *= 1.05 }
$3<100 { $3 = 100 }
{ printf("%s %8s %d\n", $1, $2, $3)}
執行下列命令 :
$awk -f adjust1.awk emp.dat
結果如下 :
螢幕出現 :
A125 Jenny 105
A341 Dan 115
P158 Max 130
P148 John 125
A123 Linda 100
說 明 :
- AWK的工作程序是:
從資料檔中每次讀入一筆資料列, 依序執行完程式中所有的
Pattern{ Action }指令
Pattern | Actions
|
---|
$1~/^A.*/ | { $3 *= 1.05 }
|
---|
$3 < 100 | { $3 = 100 }
|
---|
|
{printf("%s%8s%d\n",$1,$2,$3)}
|
---|
再從資料檔中讀進下一筆記錄繼續進行處理.
- 第一個 Pattern { Action }是:
$1 ~ /^A.*/ { $3 *= 1.05 }
$1 ~ /^A.*/ 是一個Pattern, 用來判斷該筆資料列的第一欄是否
包含%以``A''開頭的子字串. 其中 /^A.*/ 是一個Regular Expression,
用以表示任何以``A''開頭的字串. (有關 Regular Expression 之用法
參考 附錄 E ).
Actions 部分為 $3 *= 1.05 $3 *= 1.05 與 $3 = $3 * 1.05 意義相同.
運算子``*='' 之用法則與 C 語言中一樣. 此後與 C 語言中用法相同
的運算子或語法將不予贅述.
- 第二個 Pattern { Actions } 是:
$3 <100 {$3 = 100 }
若第三欄的資料內容(表薪資率)小於100, 則調整為100.
- 第三個 Pattern { Actions } 是:
{printf("%s %-8s %d\n",$1, $2, $3 )}
省略了Pattern(無條件執行Actions), 故所有資料列調整後的資料
都將被印出.