awk的讀取處理結構數據的案例

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 定界,以便於導入電子表格。


發佈了112 篇原創文章 · 獲贊 10 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章