<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0

     

    awk內置字符串函數詳解(轉) 
    awk提供了許多強大的字符串函數,見下表:
    awk內置字符串函數

    gsub(r,s) 在整個$0中用s替代r 
    gsub(r,s,t) 在整個t中用s替代r
    index(s,t)
     返回s中字符串t的第一位置
    length(s)
     返回s長度
    match(s,r)
     測試s是否包含匹配r的字符串
    split(s,a,fs) 在fs上將s分成序列a 
    sprint(fmt,exp) 返回經fmt格式化后的exp 
    sub(r,s)
     用$0中最左邊最長的子串代替s 
    substr(s,p) 返回字符串s中從p開始的后綴部分
    substr(s,p,n)
     返回字符串s中從p開始長度為n的后綴部分
    詳細說明一下各個函數的使用方法。

    gsub函數有點類似于sed查找和替換。它允許替換一個字符串或字符為另一個字符串或字符,并以正則表達式的形式執行。第一個函數作用于記錄$0,第二個gsub函數允許指定目標,然而,如果未指定目標,缺省為$0。
    index(s,t)函數返回目標字符串s中查詢字符串t的首位置。length函數返回字符串s字符
    長度。match函數測試字符串s是否包含一個正則表達式r定義的匹配。split使用域分隔符fs將
    字符串s劃分為指定序列a。sprint函數類似于printf函數(以后涉及),返回基本輸出格式fmt的
    結果字符串exp。sub(r,s)函數將用s替代$0中最左邊最長的子串,該子串被(r)匹配。
    sub(s,p)返回字符串s在位置p后的后綴。substr(s,p,n)同上,并指定子串長度為n。
    現在看一看awk中這些字符串函數的功能。

    1.gsub
    要在整個記錄中替換一個字符串為另一個,使用正則表達式格式,/目標模式/,替換模式
    /。例如改變學生序號4842到4899:

    $ awk 'gsub('4842/, 4899) {print $0}' grade.txt
    J.Troll 07/99 4899 Brown-3 12 26 26

    2.index
    查詢字符串s中t出現的第一位置。必須用雙引號將字符串括起來。例如返回目標字符串
    Bunny中ny出現的第一位置,即字符個數。

    $ awk 'BEGIN {print index("Bunny", "ny")} grade.txt
    4

    3.length
    返回所需字符串長度,例如檢驗字符串J.Troll返回名字及其長度,即人名構成的字符個
    數。

    $ awk '$1=="J.Troll" {print length($1) " "$1}' grade.txt
    7 J.Troll

    還有一種方法,這里字符串加雙引號。

    $ awk 'BEGIN {print length("A FEW GOOD MEN")}'
    14

    4.match
    match測試目標字符串是否包含查找字符的一部分。可以對查找部分使用正則表達式,返
    回值為成功出現的字符排列數。如果未找到,返回0,第一個例子在ANCD中查找d。因其不
    存在,所以返回0。第二個例子在ANCD中查找D。因其存在,所以返回ANCD中D出現的首位
    置字符數。第三個例子在學生J.Lulu中查找u。

    $ awk '{BEGIN {print match("ANCD", /d/)}'
    0
    $ awk '{BEGIN {print match("ANCD", /C/)}'
    3
    $ awk '$1=="J.Lulu" {print match($1, "u")} grade.txt
    4

    5.split
    使用split返回字符串數組元素個數。工作方式如下:如果有一字符串,包含一指定分隔
    符-,例如AD2-KP9-JU2-LP-1,將之劃分成一個數組。使用split,指定分隔符及數組名。此
    例中,命令格式為("AD2-KP9-JU2-LP-1",parts_array,"-"),split然后返回數組下標數,這
    里結果為4。
    還有一個例子使用不同的分隔符。

    $ awk '{BEGIN {print split("123#456#678", myarray, "#")}'
    3

    這個例子中,split返回數組myarray的下標數。數組myarray取值如下:

    Myarray[1]="123"
    Myarray[2]="456"
    Myarray[3]="789"

    6.sub
    使用sub發現并替換模式的第一次出現位置。字符串STR包含‘popedpopopill’,執行下
    列sub命令sub(/op/,"op",STR)。模式op第一次出現時,進行替換操作,返回結果如下:
    ‘pOPedpopepill’。
    假如grade.txt文件中,學生J.Troll的記錄有兩個值一樣,“目前級別分”與“最高級別分”。只
    改變第一個為29,第二個仍為24不動,操作命令為sub(/26/,"29",$0),只替換第一個出現
    24的位置。

    $ awk '$1=="J.Troll" sub(/26/, "29", $0)' grade.txt
    L.Troll 07/99 4842 Brown-3 12 29 26
    L.Transley 05/99 4712 Brown-2 12 30 28

    7.substr
    substr是一個很有用的函數。它按照起始位置及長度返回字符串的一部分。例子如下:

    $ awk '$1=="L.Transley" {print substr($1, 1,5)}' grade.txt
    L.Tan
    上面例子中,指定在域1的第一個字符開始,返回其前面5個字符。
    如果給定長度值遠大于字符串長度, awk將從起始位置返回所有字符,要抽取L.Tansley的姓,只需從第3個字符開始返回長度為7??梢暂斎腴L度99,awk返回結果相同。

    $ awk '{$1=="L.Transley" {print substr($1, 3,99)}' grade.txt
    Transley

    substr的另一種形式是返回字符串后綴或指定位置后面字符。這里需要給出指定字符串及其返回字串的起始位置。例如,從文本文件中抽取姓氏,需操作域1,并從第三個字符開始:

    $ awk '{print substr($1, 3)}' grade.txt
    Troll
    Transley

    還有一個例子,在BEGIN部分定義字符串,在END部分返回從第t個字符開始抽取的子串。

    $ awk '{BEGIN STR="A FEW GOOD MEN"} END {print substr(STR,7)) grade.txt
    GOOD MEN

    8.從shell中向awk傳入字符串
    awk腳本大多只有一行,其中很少是字符串表示的,這一點通過將變量傳入awk命令行會變得很容易?,F就其基本原理講述一些例子。
    使用管道將字符串stand-by傳入awk,返回其長度。

    $ echo "Stand-by" | awk '{print length($0)}'
    8

    設置文件名為一變量,管道輸出到awk,返回不帶擴展名的文件名。

    $ STR="mydoc.txt"
    $ echo $STR | awk '{print subst($STR, 1, 5)}'
    mydoc

    設置文件名為一變量,管道輸出到awk,只返回其擴展名。
    $ STR="mydoc.txt"
    $ echo $STR | awk '{print substr($STR, 7)}'
    txt
     
     
     
     

    posted on 2011-03-03 17:18 xzc 閱讀(1586) 評論(2)  編輯  收藏 所屬分類: linux/unix

    評論:
    # re: awk內置字符串函數詳解(轉) 2011-03-29 09:52 | Xor
    標題寫了一個“轉”字,但是卻沒有留出處。  回復  更多評論
      
    # re: awk內置字符串函數詳解(轉) 2011-09-07 22:52 | xzc
    用法說明:
    awk -f ngn.awk ss.txt>new.txt
    ss.txt為源文件
    new.txt為處理結果文件
    把ngn.awk放到shell目錄下

    #ngn.awk
    BEGIN {
    FS = ":";
    }
    {
    if(substr($1,1,9) == "ENDOFUSER") {
    printf ("%s|%s\n",baseinfo,camelinfo);
    authinfo = "";
    baseinfo = "";
    ssdata = "";
    camelinfo ="";
    } else if ($1 == "AUTHINFO") {
    #split($2,a,",");
    #authinfo = "";
    } else if ($1 == "BASEINFO") {
    split($2,a,",");
    baseinfo=a[1]"|"a[2]"|"a[34]"|"a[40];
    } else if($1 == "SSDATA") {
    #split($2,a,",");
    #ssdata = "";
    } else if($1 == "CAMELINFO") {
    split($2,a,",");
    camelinfo=a[6];
    }
    }
    END {

    }

      回復  更多評論
      
    主站蜘蛛池模板: 亚洲av成人一区二区三区| 亚洲AV色香蕉一区二区| 亚洲精品无码久久久久秋霞| 国产精品色拉拉免费看| 亚洲精品91在线| 国产免费丝袜调教视频| 亚洲人成在线免费观看| 性生交片免费无码看人| 亚洲中文字幕久久久一区| 成人免费网站在线观看| 黄网站色视频免费观看45分钟| 亚洲AV伊人久久青青草原| 久久久久久国产a免费观看不卡| 亚洲中文字幕无码爆乳AV| 免费观看久久精彩视频| 亚洲精品日韩中文字幕久久久| 91网站免费观看| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲国产aⅴ综合网| 免费国产午夜高清在线视频| 亚洲欧洲国产综合| 在线观着免费观看国产黄| 一区二区免费在线观看| 亚洲福利视频导航| 成人无遮挡裸免费视频在线观看| 亚洲国产综合AV在线观看| 国产亚洲精品久久久久秋霞| 在线观看的免费网站无遮挡| 亚洲日韩精品国产一区二区三区 | 18禁超污无遮挡无码免费网站国产| 亚洲天然素人无码专区| 狠狠综合久久综合88亚洲| 无码国产精品一区二区免费| 水蜜桃视频在线观看免费| 77777_亚洲午夜久久多人| 国产在线19禁免费观看国产| 热99RE久久精品这里都是精品免费 | 亚洲国产女人aaa毛片在线| 成人毛片视频免费网站观看| 国产特黄一级一片免费| 亚洲国产乱码最新视频|