溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用awk添加文本

發(fā)布時(shí)間:2021-11-30 17:53:23 來(lái)源:億速云 閱讀:271 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“如何使用awk添加文本”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用awk添加文本”這篇文章吧。

添加文本

可以按照添加控制序列或其他字符的相同方式將文本添加到顯示中。例如,要將分隔符從空格改為冒號(hào),則命令是


awk '{print $1":"$2":"$3":"$4":"$5}' emp_names > new_emp_names
在這種情況下,字符 (:) 包含在引號(hào) ("/") 中,它被添加到每個(gè)字段之間。在引號(hào)之間的值可以是任何內(nèi)容。例如,創(chuàng)建一個(gè)關(guān)于居住在阿拉巴馬州的員工的外觀類似數(shù)據(jù)庫(kù)的顯示:


$ awk '$5 ~ /AL/ {print "NAME: "$2", "$3"nCITY-STATE:   "$4", "$5"n"}' emp_namesNAME: DULANEY, EVANCITY-STATE: MOBILE, ALNAME: DURHAM, JEFFCITY-STATE: MOBILE, ALNAME: STEEN, BILLCITY-STATE: MOBILE, ALNAME: FELDMAN, EVANCITY-STATE: MOBILE, ALNAME: SWIM, STEVECITY-STATE: UNKNOWN, AL$
數(shù)學(xué)操作

AWK 除了提供文本功能,還提供全部范圍的算術(shù)操作符,包括以下符號(hào):

+ 將數(shù)字相加
- 減
* 乘
/ 除
^ 執(zhí)行指數(shù)運(yùn)算
% 提供模
++ 將變量值加一
+= 將其他操作的結(jié)果分配給變量
— 將變量減一
-= 將減法操作的結(jié)果分配給變量
*= 分配乘法操作的結(jié)果
/= 分配除法操作的結(jié)果
%= 分配求模操作的結(jié)果

例如,假定您的機(jī)器上存在以下的文件,詳細(xì)地列出硬件商店中的物品:


$ cat inventoryhammers 5        7.99drills   2       29.99punches 7        3.59drifts   2        4.09bits    55        1.19saws   123       14.99nails 800         .19screws 80         .29brads 100         .24$
第一項(xiàng)業(yè)務(wù)定單是通過(guò)將第二個(gè)字段(數(shù)量)的值乘以第三個(gè)字段(價(jià)格)的值,計(jì)算每種物品的庫(kù)存價(jià)值:


$ awk '{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3}' inventoryhammers QTY: 5 PRICE: 7.99 TOTAL: 39.95drills QTY: 2 PRICE: 29.99 TOTAL: 59.98punches QTY: 7 PRICE: 3.59 TOTAL: 25.13drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18bits QTY: 55 PRICE: 1.19 TOTAL: 65.45saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77nails QTY: 800 PRICE: .19 TOTAL: 152screws QTY: 80 PRICE: .29 TOTAL: 23.2brads QTY: 100 PRICE: .24 TOTAL: 24$
如果這些行本身并不重要,您只是希望確定商店中有多少件物品,則可以分配一個(gè)普通變量,按照每條記錄中的物品數(shù)量增加:


$ awk '{x=x+$2} {print x}' inventory5714167119499410741174$
根據(jù)這一數(shù)據(jù),商店中有 1174 件物品。第一次執(zhí)行時(shí),變量 x 沒(méi)有值,因此它采用第一行第二個(gè)字段的值。第二次執(zhí)行時(shí),它保留了第一行的值并加上第二行的值,以此類推,直到達(dá)到累計(jì)的總合。

可以應(yīng)用相同的過(guò)程來(lái)確定現(xiàn)有庫(kù)存的總價(jià)值:


$ awk '{x=x+($2*$3)} {print x}' inventory39.9599.93125.06133.24198.692042.462194.462217.662241.66$
因此,1174 件物品的價(jià)值是 $2,241.66。雖然這一過(guò)程可以獲得總計(jì)值,但它的外觀很差,需要加工成實(shí)際的報(bào)表。利用一些附加項(xiàng),很容易使顯示變得更整潔:


$ awk '{x=x+($2*$3)}{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3,"BAL: "x}' inventoryhammers QTY: 5 PRICE: 7.99 TOTAL: 39.95 BAL: 39.95drills QTY: 2 PRICE: 29.99 TOTAL: 59.98 BAL: 99.93punches QTY: 7 PRICE: 3.59 TOTAL: 25.13 BAL: 125.06drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18 BAL: 133.24bits QTY: 55 PRICE: 1.19 TOTAL: 65.45 BAL: 198.69saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77 BAL: 2042.46nails QTY: 800 PRICE: .19 TOTAL: 152 BAL: 2194.46screws QTY: 80 PRICE: .29 TOTAL: 23.2 BAL: 2217.66brads QTY: 100 PRICE: .24 TOTAL: 24 BAL: 2241.66$
該過(guò)程提供了每條記錄的清單,同時(shí)將總價(jià)值分配給庫(kù)存值,并保持商店資產(chǎn)的運(yùn)作平衡。

BEGIN 和 END

使用 BEGIN 和 END 語(yǔ)句可以分別指定在處理實(shí)際開(kāi)始之前或者完成之后進(jìn)行操作。BEGIN 語(yǔ)句最常用于建立變量或顯示標(biāo)題。另一方面,END 語(yǔ)句可用于在程序結(jié)束后繼續(xù)進(jìn)行處理。

在前面的示例中,利用以下例程生成了物品的總價(jià)值:


awk '{x=x+($2*$3)} {print x}' inventory
該例程在運(yùn)行總計(jì)累加時(shí)顯示了文件中的每一行。沒(méi)有其他方法可以指定它,而不讓在每一行進(jìn)行打印也導(dǎo)致它始終不打印出來(lái)。但是,利用 END 語(yǔ)句可以避免這一問(wèn)題:


$ awk '{x=x+($2*$3)} END {print "Total Value of Inventory:"x}' inventoryTotal Value of Inventory: 2241.66$
定義了變量 x,它對(duì)每一行進(jìn)行處理;但是,在所有處理完成之前不會(huì)生成顯示。盡管可以作為獨(dú)立例程使用,它也可以置入到先前的代碼列表,添加更多信息并生成更完整的報(bào)表:


$ awk '{x=x+($2*$3)} {print $1,"QTY: "$2,"PRICE:      "$3,"TOTAL: "$2*$3} END {print "Total Value of Inventory: " x}' inventoryhammers QTY: 5 PRICE: 7.99 TOTAL: 39.95drills QTY: 2 PRICE: 29.99 TOTAL: 59.98punches QTY: 7 PRICE: 3.59 TOTAL: 25.13drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18bits QTY: 55 PRICE: 1.19 TOTAL: 65.45saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77nails QTY: 800 PRICE: .19 TOTAL: 152screws QTY: 80 PRICE: .29 TOTAL: 23.2brads QTY: 100 PRICE: .24 TOTAL: 24Total Value of Inventory: 2241.66$
BEGIN 命令與 END 的工作方式相同,但它建立了那些需要在完成其他工作之前所做的項(xiàng)目。該過(guò)程最常見(jiàn)的目的是創(chuàng)建報(bào)表的標(biāo)題。此例程的語(yǔ)法類似于


$ awk 'BEGIN {print "ITEM    QUANTITY    PRICE    TOTAL"}'
輸入、輸出和源文件

AWK 工具可以從文件中讀取其輸入,正如在此之前所有示例所做的那樣,它也可以從其他命令的輸出中獲取輸入。例如:


$ sort emp_names | awk '{print $3,$2}'
awk 命令的輸入是排序操作的輸出。除了 sort,還可以使用任何其他的 Linux 命令 — 例如 grep。該過(guò)程允許您在離開(kāi)所選定字段前對(duì)文件執(zhí)行其他操作。

類似于解釋程序,AWK 使用輸出改向操作符 > 和 >> 將其輸出放入文件中而不是標(biāo)準(zhǔn)輸出設(shè)備。這些符號(hào)的作用類似于它們?cè)诮忉尦绦蛑械膶?duì)應(yīng)符號(hào),因此 > 在不存在文件時(shí)創(chuàng)建文件,而 >> 追加到現(xiàn)有文件的尾部。請(qǐng)看以下的示例:


$ awk '{print NR, $1 ) > "/tmp/filez" }' emp_names$ cat /tmp/filez1 460122 460133 460154 460175 460186 460197 460218 460229 4602410 4602611 4602712 46029$
檢查該語(yǔ)句的語(yǔ)法,您會(huì)看到輸出改向是在打印語(yǔ)句完成后進(jìn)行的。必須將文件名包含在引號(hào)中,否則它只是一 個(gè)未初始化的 AWK 變量,而將指令聯(lián)接起來(lái)會(huì)在 AWK 中產(chǎn)生錯(cuò)誤。(如果不正確地使用改向符號(hào),則 AWK 無(wú)法了解該符號(hào)意味著“改向”還是一個(gè)關(guān)系操作符。)

在 AWK 中輸出到管道也類似于解釋程序中所實(shí)現(xiàn)的相同操作。要將打印命令的輸出發(fā)送到管道中,可以在打印命令后附加管道符號(hào)以及命令的名稱,如下所示:


$ awk '{ print $2 | "sort" }' emp_namesBOGUEBUCKDULANEYDURHAMFELDMANFERGUSJUNEKANESTEENSWIMTUTTLEWOOD$
這是輸出改向的情況,必須將命令包含在引號(hào)中,而管道的名稱是被執(zhí)行命令的名稱。

AWK 所使用的命令可以來(lái)自兩個(gè)地方。首先,可以在命令行中指定它們,如示例中所示。其次,它們可以由源文件提供。如果是這種情況,通過(guò) -f 選項(xiàng)將這種情況向 AWK 發(fā)出警告。演示如下:


$ cat awklist{print $3,$2}{print $4,$5,"n"}$$ awk -f awklist emp_namesEVAN DULANEYMOBILE ALJEFF DURHAMMOBILE ALBILL STEENMOBILE ALEVAN FELDMANMOBILE ALSTEVE SWIMUNKNOWN ALROBERT BOGUEPHOENIX AZMICAH JUNEPHOENIX AZSHERYL KANEUNKNOWN ARWILLIAM WOODMUNCIE INSARAH FERGUSMUNCIE INSARAH BUCKMUNCIE INBOB TUTTLEMUNCIE IN$
注意,在源文件中的任何地方或者在命令行中調(diào)用它時(shí),不使用單引號(hào)。單引號(hào)只用于區(qū)別命令行中的命令與文件名稱。

如果簡(jiǎn)單的輸出不能處理您的程序中所需要的復(fù)雜信息,則可以嘗試由 printf 命令獲得的更加復(fù)雜的輸出,其語(yǔ)法是


printf( format, value, value ...)
該語(yǔ)法類似于 C 語(yǔ)言中的 printf 命令,而格式的規(guī)格是相同的。通過(guò)插入一項(xiàng)定義如何打印數(shù)值的規(guī)格,可以定義該格式。格式規(guī)格包含一個(gè)跟有字母的 %。類似于打印命令,printf 不必包含在圓括號(hào)中,但是可以認(rèn)為使用圓括號(hào)是一種良好的習(xí)慣。

下表列出 printf 命令提供的各種規(guī)格。

規(guī)格 說(shuō)明
%c 打印單個(gè) ASCII 字符
%d 打印十進(jìn)制數(shù)
%e 打印數(shù)字的科學(xué)計(jì)數(shù)表示
%f 打印浮點(diǎn)表示
%g 打印 %e 或 %f;兩種方式都更簡(jiǎn)短
%o 打印無(wú)符號(hào)的八進(jìn)制數(shù)
s 打印 ASCII 字符串
%x 打印無(wú)符號(hào)的十六進(jìn)制數(shù)
%% 打印百分號(hào);不執(zhí)行轉(zhuǎn)換

可以在 % 與字符之間提供某些附加的格式化參數(shù)。這些參數(shù)進(jìn)一步改進(jìn)數(shù)值的打印方式:

參數(shù) 說(shuō)明
- 將字段中的表達(dá)式向左對(duì)齊
,width 根據(jù)需要將字段補(bǔ)齊到指定寬度(前導(dǎo)零使用零將字段補(bǔ)齊)  
.prec 小數(shù)點(diǎn)右面數(shù)字的最大字符串寬度或最大數(shù)量

printf 命令能夠控制并將數(shù)值從一種格式轉(zhuǎn)換為另一種格式。當(dāng)需要打印變量的值時(shí),只需提供一種規(guī)格,指示 printf 如何打印信息(通常包含在雙引號(hào)中)即可。必須為每個(gè)傳遞到 printf 的變量包含一個(gè)規(guī)格參數(shù);如果包含過(guò)少的參數(shù),則 printf 不會(huì)打印所有的數(shù)值。

處理錯(cuò)誤

AWK 工具報(bào)告所發(fā)生錯(cuò)誤的方式很令人惱火。一個(gè)錯(cuò)誤會(huì)阻礙任何操作的進(jìn)行,所提供的錯(cuò)誤信息非常含混不清:


awk: syntax error near line 2awk: bailing out near line 2
您可能會(huì)花幾小時(shí)的時(shí)間查看第 2 行,試圖找出它為什么阻礙程序運(yùn)行;這就是支持使用源文件的一個(gè)有力論據(jù)。

切記有兩條規(guī)則可以幫助您避免出現(xiàn)語(yǔ)法錯(cuò)誤:

1. 確保命令位于括號(hào)中,而括號(hào)位于單引號(hào)中。沒(méi)有使用這些字符之一必然導(dǎo)致程序無(wú)法運(yùn)行。

2. 搜索命令需要位于斜線之間。要找出住在印第安那州的員工,您必須使用“/IN/”而不是“IN”。

以上是“如何使用awk添加文本”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

awk
AI