這篇文章主要為大家展示了“如何使用awk添加文本”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用awk添加文本”這篇文章吧。
站在用戶的角度思考問題,與客戶深入溝通,找到博野網(wǎng)站設(shè)計與博野網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋博野地區(qū)。
添加文本
可以按照添加控制序列或其他字符的相同方式將文本添加到顯示中。例如,要將分隔符從空格改為冒號,則命令是
awk '{print $1":"$2":"$3":"$4":"$5}' emp_names > new_emp_names
在這種情況下,字符 (:) 包含在引號 ("/") 中,它被添加到每個字段之間。在引號之間的值可以是任何內(nèi)容。例如,創(chuàng)建一個關(guān)于居住在阿拉巴馬州的員工的外觀類似數(shù)據(jù)庫的顯示:
$ 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ù)操作符,包括以下符號:
+ 將數(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$
第一項業(yè)務(wù)定單是通過將第二個字段(數(shù)量)的值乘以第三個字段(價格)的值,計算每種物品的庫存價值:
$ 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$
如果這些行本身并不重要,您只是希望確定商店中有多少件物品,則可以分配一個普通變量,按照每條記錄中的物品數(shù)量增加:
$ awk '{x=x+$2} {print x}' inventory5714167119499410741174$
根據(jù)這一數(shù)據(jù),商店中有 1174 件物品。第一次執(zhí)行時,變量 x 沒有值,因此它采用第一行第二個字段的值。第二次執(zhí)行時,它保留了第一行的值并加上第二行的值,以此類推,直到達(dá)到累計的總合。
可以應(yīng)用相同的過程來確定現(xiàn)有庫存的總價值:
$ awk '{x=x+($2*$3)} {print x}' inventory39.9599.93125.06133.24198.692042.462194.462217.662241.66$
因此,1174 件物品的價值是 $2,241.66。雖然這一過程可以獲得總計值,但它的外觀很差,需要加工成實際的報表。利用一些附加項,很容易使顯示變得更整潔:
$ 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$
該過程提供了每條記錄的清單,同時將總價值分配給庫存值,并保持商店資產(chǎn)的運(yùn)作平衡。
BEGIN 和 END
使用 BEGIN 和 END 語句可以分別指定在處理實際開始之前或者完成之后進(jìn)行操作。BEGIN 語句最常用于建立變量或顯示標(biāo)題。另一方面,END 語句可用于在程序結(jié)束后繼續(xù)進(jìn)行處理。
在前面的示例中,利用以下例程生成了物品的總價值:
awk '{x=x+($2*$3)} {print x}' inventory
該例程在運(yùn)行總計累加時顯示了文件中的每一行。沒有其他方法可以指定它,而不讓在每一行進(jìn)行打印也導(dǎo)致它始終不打印出來。但是,利用 END 語句可以避免這一問題:
$ awk '{x=x+($2*$3)} END {print "Total Value of Inventory:"x}' inventoryTotal Value of Inventory: 2241.66$
定義了變量 x,它對每一行進(jìn)行處理;但是,在所有處理完成之前不會生成顯示。盡管可以作為獨立例程使用,它也可以置入到先前的代碼列表,添加更多信息并生成更完整的報表:
$ 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 的工作方式相同,但它建立了那些需要在完成其他工作之前所做的項目。該過程最常見的目的是創(chuàng)建報表的標(biāo)題。此例程的語法類似于
$ awk 'BEGIN {print "ITEM QUANTITY PRICE TOTAL"}'
輸入、輸出和源文件
AWK 工具可以從文件中讀取其輸入,正如在此之前所有示例所做的那樣,它也可以從其他命令的輸出中獲取輸入。例如:
$ sort emp_names | awk '{print $3,$2}'
awk 命令的輸入是排序操作的輸出。除了 sort,還可以使用任何其他的 Linux 命令 — 例如 grep。該過程允許您在離開所選定字段前對文件執(zhí)行其他操作。
類似于解釋程序,AWK 使用輸出改向操作符 > 和 >> 將其輸出放入文件中而不是標(biāo)準(zhǔn)輸出設(shè)備。這些符號的作用類似于它們在解釋程序中的對應(yīng)符號,因此 > 在不存在文件時創(chuàng)建文件,而 >> 追加到現(xiàn)有文件的尾部。請看以下的示例:
$ awk '{print NR, $1 ) > "/tmp/filez" }' emp_names$ cat /tmp/filez1 460122 460133 460154 460175 460186 460197 460218 460229 4602410 4602611 4602712 46029$
檢查該語句的語法,您會看到輸出改向是在打印語句完成后進(jìn)行的。必須將文件名包含在引號中,否則它只是一 個未初始化的 AWK 變量,而將指令聯(lián)接起來會在 AWK 中產(chǎn)生錯誤。(如果不正確地使用改向符號,則 AWK 無法了解該符號意味著“改向”還是一個關(guān)系操作符。)
在 AWK 中輸出到管道也類似于解釋程序中所實現(xiàn)的相同操作。要將打印命令的輸出發(fā)送到管道中,可以在打印命令后附加管道符號以及命令的名稱,如下所示:
$ awk '{ print $2 | "sort" }' emp_namesBOGUEBUCKDULANEYDURHAMFELDMANFERGUSJUNEKANESTEENSWIMTUTTLEWOOD$
這是輸出改向的情況,必須將命令包含在引號中,而管道的名稱是被執(zhí)行命令的名稱。
AWK 所使用的命令可以來自兩個地方。首先,可以在命令行中指定它們,如示例中所示。其次,它們可以由源文件提供。如果是這種情況,通過 -f 選項將這種情況向 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)用它時,不使用單引號。單引號只用于區(qū)別命令行中的命令與文件名稱。
如果簡單的輸出不能處理您的程序中所需要的復(fù)雜信息,則可以嘗試由 printf 命令獲得的更加復(fù)雜的輸出,其語法是
printf( format, value, value ...)
該語法類似于 C 語言中的 printf 命令,而格式的規(guī)格是相同的。通過插入一項定義如何打印數(shù)值的規(guī)格,可以定義該格式。格式規(guī)格包含一個跟有字母的 %。類似于打印命令,printf 不必包含在圓括號中,但是可以認(rèn)為使用圓括號是一種良好的習(xí)慣。
下表列出 printf 命令提供的各種規(guī)格。
規(guī)格 說明
%c 打印單個 ASCII 字符
%d 打印十進(jìn)制數(shù)
%e 打印數(shù)字的科學(xué)計數(shù)表示
%f 打印浮點表示
%g 打印 %e 或 %f;兩種方式都更簡短
%o 打印無符號的八進(jìn)制數(shù)
s 打印 ASCII 字符串
%x 打印無符號的十六進(jìn)制數(shù)
%% 打印百分號;不執(zhí)行轉(zhuǎn)換
可以在 % 與字符之間提供某些附加的格式化參數(shù)。這些參數(shù)進(jìn)一步改進(jìn)數(shù)值的打印方式:
參數(shù) 說明
- 將字段中的表達(dá)式向左對齊
,width 根據(jù)需要將字段補(bǔ)齊到指定寬度(前導(dǎo)零使用零將字段補(bǔ)齊)
.prec 小數(shù)點右面數(shù)字的最大字符串寬度或最大數(shù)量
printf 命令能夠控制并將數(shù)值從一種格式轉(zhuǎn)換為另一種格式。當(dāng)需要打印變量的值時,只需提供一種規(guī)格,指示 printf 如何打印信息(通常包含在雙引號中)即可。必須為每個傳遞到 printf 的變量包含一個規(guī)格參數(shù);如果包含過少的參數(shù),則 printf 不會打印所有的數(shù)值。
處理錯誤
AWK 工具報告所發(fā)生錯誤的方式很令人惱火。一個錯誤會阻礙任何操作的進(jìn)行,所提供的錯誤信息非常含混不清:
awk: syntax error near line 2awk: bailing out near line 2
您可能會花幾小時的時間查看第 2 行,試圖找出它為什么阻礙程序運(yùn)行;這就是支持使用源文件的一個有力論據(jù)。
切記有兩條規(guī)則可以幫助您避免出現(xiàn)語法錯誤:
1. 確保命令位于括號中,而括號位于單引號中。沒有使用這些字符之一必然導(dǎo)致程序無法運(yùn)行。
2. 搜索命令需要位于斜線之間。要找出住在印第安那州的員工,您必須使用“/IN/”而不是“IN”。
以上是“如何使用awk添加文本”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!