日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

通用線程:Awk 實例( 五 )


address.awk
BEGIN { FS="n" RS=""}{ print $1 ", " $2 ", " $3}
如果這個腳本保存為 address.awk,地址數(shù)據(jù)存儲在文件 address.txt 中,可以通過輸入 "awk -f address.awk address.txt" 來執(zhí)行這個腳本 。此代碼將產(chǎn)生以下輸出:
Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345Big Tony, 200 Incognito Ave., Suburbia, WA 67890
OFS 和 ORS
在 address.awk 的 print 語句中,可以看到 awk 會連接(合并)一行中彼此相鄰的字符串 。我們使用此功能在同一行上的三個字段之間插入一個逗號和空格 (", ") 。這個方法雖然有用,但比較難看 。與其在字段間插入 ", " 字符串,倒不如讓通過設(shè)置一個特殊 awk 變量 OFS,讓 awk 完成這件事 。請參考下面這個代碼片斷 。
print "Hello", "there", "Jim!"
這行代碼中的逗號并不是實際文字字符串的一部分 。事實上,它們告訴 awk "Hello"、"there" 和 "Jim!" 是單獨的字段,并且應(yīng)該在每個字符串之間打印 OFS 變量 。缺省情況下,awk 產(chǎn)生以下輸出:
Hello there Jim!
這是缺省情況下的輸出結(jié)果,OFS 被設(shè)置成 " ",單個空格 。不過,我們可以方便地重新定義 OFS,這樣 awk 將插入我們中意的字段分隔符 。以下是原始 address.awk 程序的修訂版,它使用 OFS 來輸出那些中間的 ", " 字符串:
address.awk 的修訂版
BEGIN { FS="n" RS="" OFS=", "}{ print $1, $2, $3}
awk 還有一個特殊變量 ORS,全稱是“輸出記錄分隔符” 。通過設(shè)置缺省為換行 ("n") 的 OFS,我們可以控制在 print 語句結(jié)尾自動打印的字符 。缺省 ORS 值會使 awk 在新行中輸出每個新的 print 語句 。如果想使輸出的間隔翻倍,可以將 ORS 設(shè)置成 "nn" ?;蛘?,如果想要用單個空格分隔記錄(而不換行),將 ORS 設(shè)置成 "" 。
將多行轉(zhuǎn)換成用 tab 分隔的格式
假設(shè)我們編寫了一個腳本,它將地址列表轉(zhuǎn)換成每個記錄一行,且用 tab 定界的格式,以便導(dǎo)入電子表格 。使用稍加修改的 address.awk 之后,就可以清楚地看到這個程序只適合于三行的地址 。如果 awk 遇到以下地址,將丟掉第四行,并且不打印該行:
Cousin VinnieVinnie"s Auto Shop300 City AlleySosueme, OR 76543
要處理這種情況,代碼最好考慮每個字段的記錄數(shù)量,并依次打印每個記錄 ?,F(xiàn)在,代碼只打印地址的前三個字段 。以下就是我們想要的一些代碼:
適合具有任意多字段的地址的 address.awk 版本
BEGIN { FS="n" RS="" ORS="" } { x=1 while ( x首先,將字段分隔符 FS 設(shè)置成 "n",將記錄分隔符 RS 設(shè)置成 "",這樣 awk 可以象以前一樣正確分析多行地址 。然后,將輸出記錄分隔符 ORS 設(shè)置成 "",它將使 print 語句在每個調(diào)用結(jié)尾不輸出新行 。這意味著如果希望任何文本從新的一行開始,那么需要明確寫入 print "n" 。
在主代碼塊中,創(chuàng)建了一個變量 x 來存儲正在處理的當(dāng)前字段的編號 。起初,它被設(shè)置成 1 。然后,我們使用 while 循環(huán)(一種 awk 循環(huán)結(jié)構(gòu),等同于 C 語言中的 while 循環(huán)),對于所有記錄(最后一個記錄除外)重復(fù)打印記錄和 tab 字符 。最后,打印最后一個記錄和換行;此外,由于將 ORS 設(shè)置成 "",print 將不輸出換行 。程序輸出如下,這正是我們所期望的:
我們想要的輸出 。不算漂亮,但用 tab 定界,以便于導(dǎo)入電子表格
Jimmy the Weasel 100 Pleasant Drive San Francisco, CA 12345 Big Tony 200 Incognito Ave. Suburbia, WA 67890Cousin Vinnie Vinnie"s Auto Shop 300 City Alley Sosueme, OR 76543
循環(huán)結(jié)構(gòu)
我們已經(jīng)看到了 awk 的 while 循環(huán)結(jié)構(gòu),它等同于相應(yīng)的 C 語言 while 循環(huán) 。awk 還有 "do...while" 循環(huán),它在代碼塊結(jié)尾處對條件求值,而不象標(biāo)準(zhǔn) while 循環(huán)那樣在開始處求值 。它類似于其它語言中的 "repeat...until" 循環(huán) 。以下是一個示例:

推薦閱讀