awk 系列:如何使用 awk 輸出文本中的欄位和列
Awk 輸出欄位和列
如果你熟悉 Unix/Linux 或者懂得 bash shell 編程,那麼你應該知道什麼是內部欄位分隔符(IFS)變數。awk 中默認的 IFS 是製表符和空格。
awk 中的欄位分隔符的工作原理如下:當讀到一行輸入時,將它按照指定的 IFS 分割為不同欄位,第一組字元就是欄位一,可以通過 $1 來訪問,第二組字元就是欄位二,可以通過 $2 來訪問,第三組字元就是欄位三,可以通過 $3 來訪問,以此類推,直到最後一組字元。
為了更好地理解 awk 的欄位編輯,讓我們看一個下面的例子:
例 1:我創建了一個名為 tecmintinfo.txt 的文本文件。
# vi tecmintinfo.txt
# cat tecmintinfo.txt
在 Linux 上創建一個文件
然後在命令行中,我試著使用下面的命令從文本 tecmintinfo.txt 中輸出第一個,第二個,以及第三個欄位。
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt
TecMint.comisthe
從上面的輸出中你可以看到,前三個欄位的字元是以空格為分隔符輸出的:
- 欄位一是 「TecMint.com」,可以通過
$1
來訪問。 - 欄位二是 「is」,可以通過
$2
來訪問。 - 欄位三是 「the」,可以通過
$3
來訪問。
如果你注意觀察輸出的話可以發現,輸出的欄位值並沒有被分隔開,這是 print 函數默認的行為。
為了使輸出看得更清楚,輸出的欄位值之間使用空格分開,你需要添加 (,) 操作符。
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt
TecMint.com is the
需要記住而且非常重要的是,($)
在 awk 和在 shell 腳本中的使用是截然不同的!
在 shell 腳本中,($)
被用來獲取變數的值。而在 awk 中,($)
只有在獲取欄位的值時才會用到,不能用於獲取變數的值。
例 2:讓我們再看一個例子,用到了一個名為 my_shoping.list 的包含多行的文件。
No Item_Name Unit_Price Quantity Price
1 Mouse #20,000 1 #20,000
2 Monitor #500,000 1 #500,000
3 RAM_Chips #150,000 2 #300,000
4 Ethernet_Cables #30,000 4 #120,000
如果你只想輸出購物清單上每一個物品的單價
,你只需運行下面的命令:
$ awk '//{print $2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
可以看到上面的輸出不夠清晰,awk 還有一個 printf
的命令,可以幫助你將輸出格式化。
使用 printf
來格式化 Item_Name 和 Unit_Price 的輸出:
$ awk '//{printf "%-10s %sn",$2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
總結
使用 awk 過濾文本或字元串時,欄位編輯的功能是非常重要的。它能夠幫助你從一個表的數據中得到特定的列。一定要記住的是,awk 中 ($)
操作符的用法與其在 shell 腳本中的用法是不同的!
希望這篇文章對您有所幫助。如有任何疑問,可以在評論區域發表評論。
via: http://www.tecmint.com/awk-print-fields-columns-with-space-separator/
作者:Aaron Kili 譯者:Cathon,ictlyh 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive