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簡介中文

 

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s