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

通用線程:Awk 實例( 四 )


如果字段由空格分隔(一個或多個空格或 tab),您可能想要將 FS 設置成以下規(guī)則表達式:
FS="[[:space:] ]"
這個賦值表達式也有問題,它并非必要 。為什么?因為缺省情況下,F(xiàn)S 設置成單一空格字符,awk 將這解釋成表示“一個或多個空格或 tab” 。在這個特殊示例中,缺省 FS 設置恰恰是您最想要的!
復雜的規(guī)則表達式也不成問題 。即使您的記錄由單詞 "foo" 分隔,后面跟著三個數字,以下規(guī)則表達式仍允許對數據進行正確的分析:
FS="foo[0-9][0-9][0-9]"
字段數量
接著我們要討論的兩個變量通常并不是需要賦值的,而是用來讀取以獲取關于輸入的有用信息 。第一個是 NF 變量,也叫做“字段數量”變量 。awk 會自動將該變量設置成當前記錄中的字段數量 ??梢允褂?NF 變量來只顯示某些輸入行:
NF == 3 { print "this particular record has three fields: " $0 }
當然,也可以在條件語句中使用 NF 變量,如下:
{ if ( NF > 2 ) { print $1 " " $2 ":" $3 }}
記錄號
記錄號 (NR) 是另一個方便的變量 。它始終包含當前記錄的編號(awk 將第一個記錄算作記錄號 1) 。迄今為止,我們已經處理了每一行包含一個記錄的輸入文件 。對于這些情況,NR 還會告訴您當前行號 。然而,當我們在本系列以后部分中開始處理多行記錄時,就不會再有這種情況,所以要注意!可以象使用 NF 變量一樣使用 NR 來只打印某些輸入行:
(NR < 10 ) || (NR > 100) { print "We are on record number 1-9 or 101 " }
另一個示例:
{ #skip header if ( NR > 10 ) { print "ok, now for the real information!" }}
awk 提供了適合各種用途的附加變量 。我們將在以后的文章中討論這些變量 。
現(xiàn)在已經到了初次探索 awk 的尾聲 。隨著本系列的開展,我將演示更高級的 awk 功能,我們將用一個真實的 awk 應用程序作為本系列的結尾 。同時,如果急于學習更多知識,請參考以下列出的參考資料 。
第二部分
在這篇 awk 簡介的續(xù)集中,Daniel Robbins 繼續(xù)探索 awk(一種很棒但有怪異名稱的語言) 。Daniel 將演示如何處理多行記錄、使用循環(huán)結構,以及創(chuàng)建并使用 awk 數組 。閱讀完本文后,您將精通許多 awk 的功能,而且可以編寫您自己的功能強大的 awk 腳本 。
多行記錄
awk 是一種用于讀取和處理結構化數據(如系統(tǒng)的 /etc/passwd 文件)的極佳工具 。/etc/passwd 是 UNIX 用戶數據庫,并且是用冒號定界的文本文件,它包含許多重要信息,包括所有現(xiàn)有用戶帳戶和用戶標識,以及其它信息 。在我的前一篇文章中,我演示了 awk 如何輕松地分析這個文件 。我們只須將 FS(字段分隔符)變量設置成 ":" 。
正確設置了 FS 變量之后,就可以將 awk 配置成分析幾乎任何類型的結構化數據,只要這些數據是每行一個記錄 。然而,如果要分析占據多行的記錄,僅僅依靠設置 FS 是不夠的 。在這些情況下,我們還需要修改 RS 記錄分隔符變量 。RS 變量告訴 awk 當前記錄什么時候結束,新記錄什么時候開始 。
譬如,讓我們討論一下如何完成處理“聯(lián)邦證人保護計劃”所涉及人員的地址列表的任務:
Jimmy the Weasel100 Pleasant DriveSan Francisco, CA 12345Big Tony200 Incognito Ave.Suburbia, WA 67890
理論上,我們希望 awk 將每 3 行看作是一個獨立的記錄,而不是三個獨立的記錄 。如果 awk 將地址的第一行看作是第一個字段 ($1),街道地址看作是第二個字段 ($2),城市、州和郵政編碼看作是第三個字段 $3,那么這個代碼就會變得很簡單 。以下就是我們想要得到的代碼:
BEGIN { FS="n" RS=""}
在上面這段代碼中,將 FS 設置成 "n" 告訴 awk 每個字段都占據一行 。通過將 RS 設置成 "",還會告訴 awk 每個地址記錄都由空白行分隔 。一旦 awk 知道是如何格式化輸入的,它就可以為我們執(zhí)行所有分析工作,腳本的其余部分很簡單 。讓我們研究一個完整的腳本,它將分析這個地址列表,并將每個記錄打印在一行上,用逗號分隔每個字段 。

推薦閱讀