使用awk輸出文本中的字段和列的方法
首先我們要知道,awk 能夠自動(dòng)將輸入的行,分隔為若干字段。每一個(gè)字段就是一組字符,它們和其他的字段由一個(gè)內(nèi)部字段分隔符分隔開來。
如果你熟悉 Unix/Linux 或者懂得 bash shell 編程,那么你應(yīng)該知道什么是內(nèi)部字段分隔符(IFS)變量。awk 中默認(rèn)的 IFS 是制表符和空格。
awk 中的字段分隔符的工作原理如下:當(dāng)讀到一行輸入時(shí),將它按照指定的 IFS 分割為不同字段,第一組字符就是字段一,可以通過 $1 來訪問,第二組字符就是字段二,可以通過 $2 來訪問,第三組字符就是字段三,可以通過 $3 來訪問,以此類推,直到最后一組字符。
為了更好地理解 awk 的字段編輯,讓我們看一個(gè)下面的例子:
例 1:我創(chuàng)建了一個(gè)名為 tecmintinfo.txt 的文本文件。
# vi tecmintinfo.txt
# cat tecmintinfo.txt

在 Linux 上創(chuàng)建一個(gè)文件
然后在命令行中,我試著使用下面的命令從文本 tecmintinfo.txt 中輸出第一個(gè),第二個(gè),以及第三個(gè)字段。
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt
TecMint.comisthe
從上面的輸出中你可以看到,前三個(gè)字段的字符是以空格為分隔符輸出的:
字段一是 “TecMint.com”,可以通過 $1 來訪問。 字段二是 “is”,可以通過 $2 來訪問。 字段三是 “the”,可以通過 $3 來訪問。
如果你注意觀察輸出的話可以發(fā)現(xiàn),輸出的字段值并沒有被分隔開,這是 print 函數(shù)默認(rèn)的行為。
為了使輸出看得更清楚,輸出的字段值之間使用空格分開,你需要添加 (,) 操作符。
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt
TecMint.com is the
需要記住而且非常重要的是,($) 在 awk 和在 shell 腳本中的使用是截然不同的!
在 shell 腳本中,($) 被用來獲取變量的值。而在 awk 中,($) 只有在獲取字段的值時(shí)才會(huì)用到,不能用于獲取變量的值。
例 2:讓我們?cè)倏匆粋€(gè)例子,用到了一個(gè)名為 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
如果你只想輸出購(gòu)物清單上每一個(gè)物品的單價(jià),你只需運(yùn)行下面的命令:
$ 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 還有一個(gè) printf 的命令,可以幫助你將輸出格式化。
使用 printf 來格式化 Item_Name 和 Unit_Price 的輸出:
$ awk '//{printf "%-10s %s/n",$2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
總結(jié)
使用 awk 過濾文本或字符串時(shí),字段編輯的功能是非常重要的。它能夠幫助你從一個(gè)表的數(shù)據(jù)中得到特定的列。一定要記住的是,awk 中 ($) 操作符的用法與其在 shell 腳本中的用法是不同的!
相關(guān)文章
linux awk刪除文本重復(fù)行需要注意強(qiáng)制類型轉(zhuǎn)換的問題
這篇文章主要介紹了linux awk刪除文本重復(fù)行需要注意強(qiáng)制類型轉(zhuǎn)換的問題 ,需要的朋友可以參考下2016-12-04
next 命令幫助你阻止運(yùn)行命令執(zhí)行過程中多余的步驟;一些朋友還不知道如何使用awk的next命令;下面小編為大家?guī)硎褂胊wk的next命令的方法;有需要的朋友可以過來看看2016-11-24總結(jié)Linux中用于文本處理的awk、sed、grep命令用法
這篇文章主要介紹了Linux中用于文本處理的awk、sed、grep命令用法總結(jié),是Linux入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-03-21- 這篇文章主要介紹了Linux下的AWK入門教程,AWK工具甚至能夠自編程實(shí)現(xiàn)功能,是非常強(qiáng)大的文本分析工具,需要的朋友可以參考下2015-08-11
- 這篇文章主要介紹了Linux命令之a(chǎn)wk命令使用介紹,本文只是簡(jiǎn)單的講解了sed的語(yǔ)法以及使用實(shí)例,需要的朋友可以參考下2016-06-05
Linux如何使用awk文本處理工具進(jìn)行數(shù)組排序
awk是款文本處理工具,提供多種功能,那么如何使用awk進(jìn)行數(shù)組排序呢?下面小編就給大家詳細(xì)介紹下Linux中如何使用awk進(jìn)行數(shù)組排序2015-01-20Linux使用awk文本處理工具實(shí)現(xiàn)多行合并的實(shí)例
在Linux系統(tǒng)中使用awk文本處理工具,有時(shí)需要將多行合并,這就需要用到awknext語(yǔ)句了,下面有個(gè)不錯(cuò)的示例,需要的朋友可以看看2015-01-20linux awk 數(shù)組排序多種實(shí)現(xiàn)方法
由于awk數(shù)組,是關(guān)聯(lián)數(shù)組。for…in循環(huán)輸出時(shí)候,默認(rèn)打印出來是無序數(shù)組2013-11-19shell awk實(shí)現(xiàn)實(shí)時(shí)監(jiān)控網(wǎng)卡流量腳本(常見應(yīng)用二)
通過第3方工具獲得網(wǎng)卡流量,這個(gè)大家一定很清楚。其實(shí)通過腳本一樣可以實(shí)現(xiàn)效果。下面是我個(gè)人工作中整理的數(shù)據(jù)。以下是shell腳本統(tǒng)計(jì)網(wǎng)卡流量2013-11-19linux awk 多文件操作2種實(shí)現(xiàn)方法
我們經(jīng)常會(huì)將2個(gè)有關(guān)聯(lián)文本文件進(jìn)行合并處理。分別從不同文件獲取需要的列,然后,整體輸出到一起。awk進(jìn)行多文件處理時(shí)候,常常會(huì)遇到2個(gè)方面問題,第一個(gè)是怎么樣合并多2013-11-19


