日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

awk详细教程:第二部分

發布時間:2025/5/22 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 awk详细教程:第二部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?2.3 表達式和運算符

awk?允許使用正則表達式,根據正則表達式是否匹配當前行來選擇執行獨立代碼塊。以下示例腳本只輸出bill中包含字符序列8613902700003的那些行:

  • awk?'/8613902700003/?{?print?}'?bill?
  • ?當然,可以使用更復雜的正則表達式:

  • /[0-9]*/?{?print?}?
  • 下面列出正則表達式元字符:

    字符

    描述

    .

    可代替除一行之外的任何單個字符

    *

    可代替零個或多個在它前面出現的字符

    [chars]

    可代替chars中的任何一個字符,chars是一串字符序列。你可以用-符號來定義一個字符范圍。如果^chars中的第一個字符,那么將匹配沒有在chars中指定的字符

    ^

    匹配一行的開頭

    $

    匹配一行的結尾

    \

    \后面的字符照常輸出,通常用來轉義(不使用特殊含義)一個元字符


    ?

    除了使用正則表達式來選擇行,我們也可以使用布爾表達式來選擇行。使用方法是將布爾表達式放在代碼塊之前,僅當對前面的布爾表達式求值為真時,awk才執行代碼塊。以下示例腳本將輸出bill中第四個字段等于8613902700003的所有行中的第三、四字段。如果當前行的第四個字段不等于8613902700003awk將繼續處理文件而不對當前行執行print語句:

    ?

  • $4?==?"8613902700003"?{?print?"OrgAddr:?"$3,?"\tDestAddr:?"$4?}?
  • ?

    注意,代碼塊前的布爾表達式必須與代碼塊在同一行上。

    awk?提供了完整的比較運算符集合,包括"==""<"">""<="">=""!="。另外,awk還提供了"~""!~"?運算符,它們分別表示匹配不匹配。它們的用法是在運算符左邊指定變量,在右邊指定正則表達式。例如:

    ?

  • $4?~?/8613902700003/?{?print?"OrgAddr:?"$3,?"\tDestAddr:?"$4?}?
  • ?

    awk還允許使用布爾運算符"||"(邏輯或)和"&&"(邏輯與),以便創建更復雜的布爾表達式:

  • (?$3?==?"8613902700001"?)?&&?(?$4?==?"8613902700003"?)?{?print?}?
  • ?

    awk的另一個優點是它有完整的數學運算符集合。除了標準的加、減、乘、除,awk還允許使用指數運算符"^"、模運算符"%"和其它許多從C語言中借入的易于使用的賦值操作符。

    這些運算符包括前后加減(i++--j)、加/減/乘/除賦值運算符(a+=3b*=2c/=2.2d-=6.2)。不僅如此,還有易于使用的模/指數賦值運算符(a^=2b%=4)。

    ?

    2.4 字符串化變量

    awk變量“字符串化”是指所有awk變量在內部都是按字符串形式存儲的。而且只要變量包含有效數字字符串,就可以對它執行數學操作,awk會自動處理字符串到數字的轉換步驟。請看以下這個示例:

  • BEGIN???{?x="0"?}?
  • /^$/????{?x=x+1?}?
  • END?????{?print?"I?found?"?x?"?blank?lines.?:)"?}?
  • 這個例子的功能是計算文件中空白行的數量,^$表示空行。如果做一個小實驗,就可以發現如果某個特定變量不包含有效數字,awk在對數學表達式求值時會將該變量當作數字0處理。

    3 第二部分:提高

    3.1 處理多行

    ?

    在這一節里,順帶著講一下三個特別的變量:

    Awk特殊變量

    描述

    RS

    表示記錄分隔符

    OFS

    表示輸出字段分隔符,在兩個單獨的字段間插入定義的字符串

    ORS

    表示輸出記錄分隔符,在兩個單獨的記錄間插入定義的字符串

    第一部分我們討論的都是一個記錄占用一行的情況,如果要分析占據多行的記錄,除了依靠FS,還需要設置RS(記錄分隔符變量)。RS變量告訴awk當前記錄什么時候結束,新記錄什么時候開始。

    為了便于討論,我們依然首先在當前目錄下生成一個通訊錄文件address,其內容如下:

    zhangsan
    13712345678
    zhs@hotmail.com

    lisi
    13012345678
    ls@21cn.com

    要處理這個文件,可以將每三行看作是一個獨立的記錄,一個記錄包含三個字段。如下腳本將原記錄由三行轉換成一行輸出:

    ?

  • BEGIN?{?
  • ????FS="\n"?
  • ????RS=""?
  • }?
  • ??
  • {?
  • ????print?$1?",?"?$2?",?"?$3?
  • }?
  • ?此代碼將產生以下輸出:

    zhangsan, 13712345678, zhs@hotmail.com
    lisi, 13012345678, ls@21cn.com

    在上面例子中,為了在三個字段之間插入一個逗號和空格,使用了", "。這個方法雖然有用,但比較難看。其實我們還有更好的方法,那就是設置變量OFS(輸出字段分隔符)。OFS缺省情況下被設置成" "(單個空格)。使用如下腳本可以達到上面例子同樣的效果:

  • BEGIN?{?
  • ????FS="\n"?
  • ????RS=""?
  • ????OFS=",?"?
  • }?
  • ??
  • {?
  • ????print?$1,?$2,?$3?
  • }?
  • awk還有一個特殊變量ORS(輸出記錄分隔符)。ORS缺省情況下被設置成"\n",如果我們將其設為"\n\n",就可以使輸出記錄的間隔翻倍。例子就不舉了,大家可以自己試試。個空格分隔記錄(而不換行),將ORS設置成" "

    需要注意的是,使用上面的方法,最多只能處理一個記錄占用三行的文本,象下面一個記錄占據四行的通訊錄,就處理不了了(大家可以試試看):

    wangwu
    13512345678
    ww@163.com
    wuhan, hubei

    ?要處理這種情況,代碼最好考慮每個記錄的字段數量,并依次打印每個記錄。以下就是修正的代碼:

  • BEGIN?{?
  • ????FS="\n"?
  • ????RS=""?
  • ????ORS=""?
  • }?
  • ??
  • {??
  • ????????x=1?
  • ????????while?(?x<NF?)?{?
  • ????????????????print?$x?"\t"?
  • ????????????????x++?
  • ????????}?
  • ????????print?$NF?"\n"?
  • }?
  • 程序輸出如下:

    ?wangwu 13512345678 ww@163.com wuhan, hubei

    轉載于:https://blog.51cto.com/bubble/1179115

    總結

    以上是生活随笔為你收集整理的awk详细教程:第二部分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。