Appendix B Actions

Actions 是由下列指令(statement)所組成 : expression ( function calls, assignments..) print expression-list printf( format, expression-list) if( expression ) statement [else statement] while( expression ) statement do statement while( expression) for( expression; expression; expression) statement for( variable in array) statement delete break continue next exit [expression] statement AWK 中大部分指令與 C 語言中的用法一致, 此處僅介紹較為常用 或容易混淆之指令的用法.
  1. 流程控制指令
  2. AWK 中的 I/O 指令
    • printf 指令
    • 該指令與 C 語言中的用法相同, 可藉由該指令控制資料輸出時 的格式. 語法 : printf("format", item1, item2,.. ) 範 例 : id = "BE-2647"; ave = 89 printf("ID# : %s Ave Score : %d\n", id, ave) (a)結果印出 : ID# :BE-647 Ave Score : 89 (b)format 部分係由 一般的字串(String Constant) 及 格式控制字元 (Formatcontrol letter, 其前會加上一個\%字元)所構成. 以上式為例 "ID# : " 及 " Ave Score : " 為一般字串. %s 及 %d 為格式控制字元. (c)印出時, 一般字串將被原封不動地印出. 遇到格式控制字元時, 則依序把 format後方之 item 轉換成所指定的格式後印出. (d)有關的細節, 讀者可從介紹 C 語言的書籍上得到較完整的介紹. (e)print 及 printf 兩個指令, 其後可使用>或< > 將輸出到stdout 的資料 Redirct到其它檔案, 7.1 Redirect Output to Files 中有完整的 範例說明.
    • print 指令 範 例 : id = "BE-267"; ave = 89 print "ID# :", id, "Ave Score :"ave (a)結果印出 : ID# : BE-267 Ave Score :89 (b)print 之後可接上字串常數(Constant String)或變數. 它們彼此間 可用``,'' 隔開. (c)上式中, 字串 "ID# :" 與變數 id 之間使用``,''隔開, 印出時兩者之間 會以自動 OFS(請參考 D 內建變數 OFS) 隔開. OFS 之值一般內定為 "一個空白字元" (d)上式中字串 "Ave Score :" 與變數ave之間並未以``,''隔開, AWK 會將這兩者先當成字串concate在一起(變成``Ave Score :89")後, 再予印出 (e)print 及 printf 兩個指令, 其後可使用> 或> 將輸出到stdout的 資料 Redirct到其它檔案, 7.1 Redirect Output to Files 中有完整的 範例說明.
    • getline 指令
      語法由何處讀取資料資料讀入後置於
      getline var> file 所指定的 file變數 var(var省略時,表示置於$0)
      | getline var pipe 變數 var(var省略時,表示置於$0)
      getline var 見 註一 變數 var(var省略時,表示置於$0)
      註一 : 當 Pattern 為 BEGIN 或 END 時, getline 將由 stdin 讀取資料, 否則由AWK正處理的資料檔上讀取資料. getline 一次讀取一行資料, 若讀取成功則return 1, 若讀取失敗則return -1, 若遇到檔案結束(EOF), 則return 0
    • close 指令 該指令用以關閉一個開啟的檔案, 或 pipe(見下例) 範 例 : awk ' BEGIN { print "ID # Salary" > "data.rpt" } { print $1 , $2 * $3 | "sort +0n > data.rpt" } END{ close( "data.rpt" ) close( "sort +0n > data.rpt" ) print " There are", NR, "records processed." } 說 明 : (a)上例中, 一開始執行 print "ID # Salary" > "data.rpt" 指令來 印出一行抬頭. 它使用 I/O Redirection( > )將資料轉輸出到data.rpt, 故此時檔案 {data.rpt} 是處於 Open 狀態. (b)指令 print $1, $2 * $3 不停的將印出的資料送往 pipe(|), AWK 於程式將結束時才會呼叫 shell 使用指令 "sort +0n > data.rpt" 來處理 pipe 中的資料; 並未立即執行, 這點與 Unix 中pipe的用法 不盡相同. (c)最後希望於檔案 {data.rpt}之``末尾''處加上一行 "There are.....". 但此時, Shell尚未執行 "sort +0n > data.rpt" 故各資料列排序後 的 ID 及 Salary 等資料尚未寫入data.rpt. 所以得命令 AWK 提前先通知 Shell 執行命令 "sort +0n > data.rpt" 來處理 pipe 中的資料. AWK中這個動作稱為 close pipe. 係由執行 close ( "shell command" )來完成. 需留心 close( )指令中的 shell command 需與``|''後方的 shell command 完全相同(一字不差), 較佳的方法是 先以該字串定義一個簡短的變數, 程式中再以此變數代替該 shell command (d)為什麼要執行 close("data.rpt") ? 因為 sort 完後的資料也將寫到 data.rpt, 而該檔案正為AWK所開啟使用(write)中, 故AWK程式中應先關閉 data.rpt. 以免造成因二個 processes 同時開啟一個檔案進行 輸出(write)所產生的錯誤.
    • system 指令
    • 該指令用以執行 Shell上 的 command. 範 例 : DataFile = "invent.rpt" system( "rm " DataFile ) 說明 : (a)system("字串")指令接受一個字串當成Shell的命令. 上例中, 使用 一個字串常數"rm " 連接(concate)一個變數 DataFile 形成要求 Shell 執行的命令.Shell 實際執行的命令為 ``rm invent.rpt''. *
    • ``|'' pipe指令 ``|'' 配合 AWK 輸出指令, 可把 output 到 stdout 的資料繼續轉送給 Shell 上的令一命令% 當成input的資料. ``|'' 配合 AWK getline 指令, 可呼叫 Shell 執行某一命令, 再以 AWK 的 getline 指令將該命令的所產生的資料讀進 AWK 程式中. 範 例 : { print $1, $2 * $3 | "sort +1n > result" } "date" | getline Date_data 讀者請參考 7.2 Using System Resources 其中有完整的範例說明.
  3. AWK 釋放所佔用的記憶體的指令
  4. AWK 程式中常使用陣列(Array)來記憶大量資料. delete 指令便是用來 釋放陣列中的元素所所佔用的記憶空間. 範 例 : for( any in X_arr ) delete X_arr[any] 讀者請留心, delete 指令一次只能釋放陣列中的一個``元素''.
  5. AWK 中的數學運算元(Arithmetic Operators)
  6. +(加), -(減), *(乘), /(除), %(求餘數), ^(指數) 與 C 語言中用法 相同
  7. AWK 中的 Assignment Operators
  8. =, +=, -=, *= , /=, %=, ^= x += 5 的意思為 x = x + 5, 其餘類推.
  9. AWK 中的 Conditonal Operator
  10. 語 法 : 判斷條件 ? value1 : value2 若 判斷條件 成立(true) 則傳回 value1, 否則傳回 value2.
  11. AWK 中的邏輯運算元(Logical Operators)
  12. &&( and ), ||or, !(not) Extended Regular Expression 中使用 ``|'' 表示 or 請勿混淆.
  13. AWK 中的關係運算元(Relational Operators)
  14. >, >=, <, < =, ==, !=, ~, !~
  15. AWK 中其它的運算元
  16. +(正號), -(負號), ++(Increment Operator), - -(Decrement Operator) AWK 中各運算元的運算優先順序( Precedence ) (按優先高低排列) $ (欄位運算元, 例如 : i=3; $i表示第3欄) ^ (指數運算) + ,- ,! (正,負號,及邏輯上的 not) * ,/ ,% (乘,除,餘數) + ,- (加,減) >, > =,< , < =, ==, != (大於,大於等於,...,等關係符號) ~, !~ (match, not match) && (邏輯上的 and) || (邏輯上的 or ) ? : (Conditional Operator) = , +=, -=,*=, /=, %=, ^= (一些指定Assignment運算元)