awk裡好用的變數:FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

awk是非常好用的工具,之前稍微介紹過它的歷史,也因為其本身是設計用來處理字串的,所以存在高效方便的好處。而當要用awk來做比較複雜的功能時,比如把:單行字串轉換成多行時等,就需要瞭解以下這些變數:FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

可以把field想成是一筆資料的行,而record則是一筆資料,理解這些字串會比較好理解 awk設計的邏輯。

這幾個變數的主要是用來:

  1. 定義字串裡面的行數分隔、換行符等,一些基本跟“一行字串”相關的數值

FS:輸入字串的分隔變數(Input Field Separator Variable)
本身預設是使用"空白格"來當作輸入字串的分隔
基本語法:

<br />用法一:$ awk -F 'Field separator' '指令' 輸入的檔案

用法二:$ awk 'BEGIN{FS='Field separator'}'

用法一,主要是把awk以cml工具來使用,而用法二則是把awk用完整語法來使用

ORS:輸出字串的分隔變數(Output Field Separator Variable)
本身預設是使用 “空白格"來當作輸出字串的分隔符
基本語法:

用法一:$ awk -F':' '{print $3,$4;}' /etc/passwd

用法二:$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd

RS:記錄分隔變數(Record Separator variable)
本身預設是"\n",也就是一行一行的讀取,當可以改成比如兩行為一筆資料的讀取,這變數可以用來處理比較負責儲存的字串資料。

直接看範例,假如我們要處理像是下面的檔案時

Jones
2143
78
84
77

Gondrol
2321
56
58
45

當我們只想要取每組資料的前兩個,變成一行時

<br />awk 'BEGIN{RS="\n\n";FS="\n"}{print $1 $2}'

ORS:輸出資料每組分隔符(Output Record Separator Variable)

NR:第幾組資料(Number of Records Variable)

NF:每組資料第幾行 (Number of Fields)

以下兩個變數主要是在使用多個檔案,一起使用awk處理時會用到的

FILENAME:目前輸入資料的檔案名稱

FNR:目前第幾筆資料相對於當前輸入檔案

 

參考閱讀資料:

8 Poerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

awk中RS, ORS, FS, OFS區別與聯繫  (裡面有使用RS等更進階的用法)

Awk Tutorial Examples

awk簡介中文

 

 

古老的程式語言awk

程式語言不斷地隨者電腦科學的發展在演進,awk可以說是最早的scripting language,衍生自貝爾實驗室,在1977年出現,其為Perl(1987)和Python(1989)的前身,有一陣不太有人使用,但隨者有結構的資料大增,這種古老語言的處理速度,使其再度被使用。

就實用性來說,可以用其來取代cut,其在將資料分成field有非常大的彈性。

基本awk架構

awk ` pattern {action } `

  • awk處理邏輯是以行為單位的
  • 當pattern存在於line中,執行action
  • 將每行中的空白格當作是分隔
  • pattern的辨識以最大化為主

特殊變數special variables

在pattern或是action指令中有變數功能,如前述每個space中間即可被當作是一個單位的資訊

  • $0 整行
  • $1  第一個field(行中由空白格分隔裡,第一組文字)
  • $2  第二個field
  • NF 第幾個field
  • NR 當下的line數

指令operators

  • +-*/ 加減乘除
  • >< ==, !=比較
  • % 取mode
  • ~,!~ 有無match到

有用的awk教學資源