awk 筆記

【資料整理】
範例: emp.txt
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210

名詞:
(1)資料列: AWK從資料檔上讀取資料的基本單位,一般而言, 一筆資料列相當於資料檔上的一行資料, ex: A125 Jenny 100 210
(2)欄位(Field) : 為資料列上被分隔開的子字串,一般是以空白字元來分隔相鄰的欄位, ex: A125

1. AWK程式中主要語法是 Pattern { Actions}

2. AWK程式的主要結構 : AWK程式中主要語法是 Pattern { Actions}

3. Pattern 是什麼 ?
AWK 提供 C 語言中常見的關係運算元(Relational Operators) 如 >, <, >=, <=, ==, !=. 此外, AWK 還提供 ~ (match) 及 !~(not match) 二個關係運算元 (註一). 其用法與涵義如下: 若 A 表一字串, B 表一 Regular Expression A ~ B 判斷 字串A 中是否 包含 能合於(match)B式樣的 子字串. A !~ B 判斷 字串A 中是否 未包含 能合於(match)B式樣的 子字串.

4. Actions 是什麼?
Actions 是由許多AWK指令構成. 而AWK的指令與 C 語言中的指令十分類似. ex:
AWK的 I/O指令 : print, printf( ), getline.. AWK的 流程控制指令 : if(…){..} else{..}, while(…){…}…

5. AWK 所內建的欄位變數及其涵意如下 :
欄位變數     涵意
$0    為一字串, 其內容為目前 AWK 所讀入的資料列.
$1    代表 $0 上第一個欄位的資料.
$2    代表 $0 上第二欄個位的資料.
…     其餘類推
$ 在 AWK 中為一運算元(Operator), 用以取得欄位資料

6. AWK的內建變數(Built-in Variables)
(1)NF-(Number of Fields)為一整數, 其值表$0上所存在的欄位數目.
(2)NR-(Number of Records)為一整數, 其值表AWK已讀入的資料列數目.
(3)FILENAMEAWK-正在處理的資料檔檔名.
(4)FS-欄位分隔字元 FS (field seperator) 是AWK的內建變數, 其預設值是空白及tab
(5)RS-(Record Separator) 的定義將檔案中的資料分隔成一筆一筆的Record. RS 的預設值是 “n”(跳行符號), 故平常AWK中一行資料就是一筆 Record. 但有些檔案中一筆Record涵蓋了數行資料, 這種情況下不能再以 “n” 來分隔Records. 最常使用的方法是相鄰的Records之間改以 一個空白行 來隔開. 在AWK程式中, 令 RS = “”(空字串)後, AWK把會空白行當成來檔案中Record的分隔符號
(6)ARGC-為一整數. 代表命令列上, 除了選項-v, -f 及其對應 的參數之外所有參數的數目
(7)ARGV[ ]-為一字串陣列. ARGV[0],ARGV[1],…ARGV[ARGC-1]. 分別代表命令列上相對應的參數.

7. AWK的工作流程 :
執行AWK時, 它會反複進行下列四步驟.
(1)自動從指定的資料檔中讀取一筆資料列.
(2)自動更新(Update)相關的內建變數之值. 如 : NF, NR, $0…
(3)逐次執行程式中 所有 的 Pattern { Actions } 指令.
(4)當執行完程式中所有 Pattern { Actions } 時, 若資料檔中還 有未讀取的資料, 則反覆執行步驟1到步驟4.
*AWK會自動重覆進行上述4個步驟, 使用者不須於程式中撰寫這個迴圈 (Loop).

8. UNIX命令列上, 執行AWK的語法為: awk ‘AWK程式’ 欲處理的資料檔檔名. 把程式置於命令列時, 程式之前後須以 ‘ 括住.

9. 將 awk 程式寫在檔案內並執行:
可使用“-f”參數,讓AWK主程式使用其它僅含 AWK函數 的檔案中的函數其語法如下: awk -f AWK主程式檔名 -f AWK函數檔名 資料檔檔名
ex. $awk -f pay1.awk emp.dat

10. 用法:
(1)列印檔案中指定的欄位資料並加以計算
(2)選印合乎指定條件的記錄
(3)AWK 程式中使用 Shell 命令

11. 保留字
(1) BEGIN: 以 { BEGIN 為 Pattern 的 Actions} 於程式一開始執行時, 被執行一次.
(2) END: 以 { END 為 Pattern 的 Actions} 於程式僅在最後才成立, 被執行一次.

12. 在編輯 AWK程式時, 須格外留心. 因為若敲錯變數名稱, AWK在編譯程式時會認為是一新的變數, 並不會察覺. 如此 往往會造成 RuntimeError.

13. AWK程式中, 檔案名稱之前後須以”” 括住, 若未以”括住, 則將被AWK解釋為一個變數名稱.

14. AWK input 指令只有 getline 一個. AWK output 指令有 print, printf() 二個.

15. AWK 中除了函數的參數列(Argument List)上的參數(Arguments)外, 所有變數不管於何處出現全被視為 Global variable. 其生命持續至程式結束

16.函數 vs. 主程式

  • 函數內可任意使用主程式中的任何變數.
  • 函數內所啟用的任何變數(除參數外), 於該函數之外依然可以使用.

17. 將函數部分單讀編寫於一檔案中, 當需要用到該函數時再以下列方式 include進來.
$ awk -f 函數襠名 -f AWK主程式檔名 資料檔檔名

【資料參考來源】

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *