在 Awk 系列的這一節中,我們将看到 awk 最重要的特性之一,字段編輯。
首先我們要知道,Awk 能夠自動将輸入的行,分隔為若幹字段。每一個字段就是一組字元,它們和其他的字段由一個内部字段分隔符分隔開來。
Awk 輸出字段和列
如果你熟悉 Unix/Linux 或者懂得 bash shell 程式設計,那麼你應該知道什麼是内部字段分隔符(IFS)變量。awk 中預設的 IFS 是制表符和空格。
awk 中的字段分隔符的工作原理如下:當讀到一行輸入時,将它按照指定的 IFS 分割為不同字段,第一組字元就是字段一,可以通過 $1 來通路,第二組字元就是字段二,可以通過 $2 來通路,第三組字元就是字段三,可以通過 $3 來通路,以此類推,直到最後一組字元。
為了更好地了解 awk 的字段編輯,讓我們看一個下面的例子:
例 1:我建立了一個名為 tecmintinfo.txt 的文本檔案。
在 Linux 上建立一個檔案
然後在指令行中,我試着使用下面的指令從文本 tecmintinfo.txt 中輸出第一個,第二個,以及第三個字段。
從上面的輸出中你可以看到,前三個字段的字元是以空格為分隔符輸出的:
字段一是 “TecMint.com”,可以通過 <code>$1</code> 來通路。
字段二是 “is”,可以通過 <code>$2</code> 來通路。
字段三是 “the”,可以通過 <code>$3</code> 來通路。
如果你注意觀察輸出的話可以發現,輸出的字段值并沒有被分隔開,這是 print 函數預設的行為。
為了使輸出看得更清楚,輸出的字段值之間使用空格分開,你需要添加 (,) 操作符。
需要記住而且非常重要的是,<code>($)</code> 在 awk 和在 shell 腳本中的使用是截然不同的!
在 shell 腳本中,<code>($)</code> 被用來擷取變量的值。而在 awk 中,<code>($)</code> 隻有在擷取字段的值時才會用到,不能用于擷取變量的值。
例 2:讓我們再看一個例子,用到了一個名為 my_shoping.list 的包含多行的檔案。
如果你隻想輸出購物清單上每一個物品的<code>單價</code>,你隻需運作下面的指令:
可以看到上面的輸出不夠清晰,awk 還有一個 <code>printf</code> 的指令,可以幫助你将輸出格式化。
使用 <code>printf</code> 來格式化 Item_Name 和 Unit_Price 的輸出:
使用 awk 過濾文本或字元串時,字段編輯的功能是非常重要的。它能夠幫助你從一個表的資料中得到特定的列。一定要記住的是,awk 中 <code>($)</code> 操作符的用法與其在 shell 腳本中的用法是不同的!
希望這篇文章對您有所幫助。如有任何疑問,可以在評論區域發表評論。
via: http://www.tecmint.com/awk-print-fields-columns-with-space-separator/
作者:Aaron Kili
譯者:Cathon,ictlyh
校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出