awk 是一種用於讀取和處理結構化數據的極佳工具.FS (字段分隔符)變量設置成 ":",可以分析出一個複雜文件的各種我們所要取得的字段;但是對於一個多行記錄需要一些其他變量來輔助;比如RS,OFS,ORS等;
如果要分析佔據多行的記錄,僅僅依靠設置 FS 是不夠的。在這些情況下,我們還需要修改 RS 記錄分隔符變量。RS 變量告訴awk 當前記錄什麼時候結束,新記錄什麼時候開始;
以下案例:
[root@Slave02 ~]# cat a.txt
jimmy the Weasel
100 pleasant Drive
San Francisco, Ca 12345
Big Tony
200 Incognito Ave.
Suburbia, WA 67890
[root@Slave02 ~]#
完成處理“聯邦證人保護計劃”所涉及人員的地址列表的任務;
[root@Slave02 ~]# cat address.awk
BEGIN {
FS="\n"
RS=""
}
{
print $1 "," $2 "," $3
}
[root@Slave02 ~]#
[root@Slave02 ~]# awk -f address.awk a.txt
jimmy the Weasel,100 pleasant Drive,San Francisco, Ca 12345
Big Tony,200 Incognito Ave.,Suburbia, WA 67890
[root@Slave02 ~]#
加入OFS變量分割符的;
[root@Slave02 ~]# vi address.awk
BEGIN {
FS="\n"
RS=""
OFS=", "
}
{
print $1 "," $2 "," $3
}
~
~
~
~
~
"address.awk" 9L, 73C written
[root@Slave02 ~]# awk -f address.awk a.txt
jimmy the Weasel,100 pleasant Drive,San Francisco, Ca 12345
Big Tony,200 Incognito Ave.,Suburbia, WA 67890
[root@Slave02 ~]#
awk 還有一個特殊變量 ORS ,全稱是“輸出記錄分隔符”。通過設置缺省爲換行 ("\n") 的 OFS ,我們可以控制在 print 語句結尾
自動打印的字符。缺省 ORS 值會使 awk 在新行中輸出每個新的 print 語句。如果想使輸出的間隔翻倍,可以將 ORS 設置成
"\n\n" 。或者,如果想要用單個空格分隔記錄(而不換行),將 ORS 設置成 "" 。
[root@Slave02 ~]# vi address.awk
BEGIN {
FS="\n"
RS=""
ORS=""
}
{
x=1
while ( x<NF ) {
print $x "\t"
x++
}
print $NF "\n"
}
~
~
~
~
~
~
"address.awk" 14L, 151C written
[root@Slave02 ~]# awk -f address.awk a.txt
jimmy the Weasel 100 pleasant Drive San Francisco, Ca 12345
Big Tony 200 Incognito Ave. Suburbia, WA 67890
[root@Slave02 ~]#
首先,將字段分隔符 FS 設置成 "\n" ,將記錄分隔符 RS 設置成 "" ,這樣 awk 可以象以前一樣正確分析多行地址。然後,將輸
出記錄分隔符 ORS 設置成 "" ,它將使 print 語句在每個調用結尾 不 輸出新行。這意味着如果希望任何文本從新的一行開始,
那麼需要明確寫入 print "\n" 。
在主代碼塊中,創建了一個變量 x 來存儲正在處理的當前字段的編號。起初,它被設置成 1 。然後,我們使用 while 循環(一
種 awk 循環結構,等同於 C 語言中的 while 循環),對於所有記錄(最後一個記錄除外)重複打印記錄和 tab 字符。最後,
打印最後一個記錄和換行;此外,由於將 ORS 設置成 "" ,print 將不輸出換行。程序輸出如下,這正是我們所期望的:
我們想要的輸出。不算漂亮,但用 tab 定界,以便於導入電子表格。
awk的讀取處理結構數據的案例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.