Linux文本處理工具之awk

    調用方式
        1.命令行
            awk [-F  field-separator]  'commands'  input-file(s)
                commands是真正awk命令,[-F域分隔符]是可選的。input-file(s) 是待處理的文件。在awk中,文件的每一行中,由域分隔符分開的每一項稱爲一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格(或者tab)。
        2.shell腳本方式
                將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作爲腳本的首行,以便通過鍵入腳本名稱來調用。相當於shell腳本首行的:#!/bin/sh 可以換成:#!/bin/awk -f
        3.將所有的awk命令插入一個單獨文件,然後調用:awk -f awk-script-file input-file(s)其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。
    內置變量
        ARGC:命令行參數個數
        ARGV:命令行參數排列
        ENVIRON:UNIX環境變量
        ERRNO:UNIX系統錯誤消息
        FILENAME:awk瀏覽的文件名
        OFMT:數字的輸出格式 %.6g
        FNR:瀏覽文件的記錄數
        FS:設置輸入域分隔符,等價於命令行 -F選項
        NF:瀏覽記錄的域的個數
        NR:已讀的記錄數,就是行號,從1開始
        FNR:當前記錄數
        OFS:輸出域分隔符
        ORS:輸出記錄分隔符
        RS:控制記錄分隔符
        $0:當前記錄(作爲單個變量)
        $1~$n:當前記錄的第n個字段,字段間由FS分隔
    輸出函數
        print:參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這裏,逗號的作用與輸出文件的分隔符的作用是一樣的,只是後者是空格而已
        printf:其用法和c語言中printf基本相似,可以格式化字符串,輸出複雜時,printf更加好用,代碼更易懂。具體格式如下:
            %d     十進制有符號整數
            %u     十進制無符號整數
            %f     浮點數
            %s     字符串
            %c     單個字符
            %p     指針的值
            %e     指數形式的浮點數
            %x     %X 無符號以十六進制表示的整數
            %o     無符號以八進制表示的整數
            %g     自動選擇合適的表示法
    獲取外部變量
        1.獲取普通外部變量
            awk ‘{action}’  變量名=變量值
        2.BEGIN程序塊中變量
            awk –v 變量名=變量值 [–v 變量2=值2 …] 'BEGIN{action}’
        3.環境變量
            需要用到內置變量ENVIRON實現
    運算符
        1.賦值運算符
            = += -= *= /= %= ^= **=
        2.邏輯運算符
            ||:邏輯或
            &&:邏輯與
        3.正則運算符
            ~:匹配正則表達式
            ~!:不匹配正則表達式
        4.關係運算符
            < <= > >= != ==
        5.算術運算符
            + - * / & ++ --
        6.其它運算符
            $:字段引用
            空格:字符串連接符
            ?:C條件表達式
            in:數組中是否存在某鍵值
    字符操作
        1.字符串轉數字
            將變量通過”+”連接運算。自動強制將字符串轉爲整型。非數字變成0,發現第一個非數字字符,後面自動忽略
        2.數字轉字符串
            只需要將變量與””符號連接起來運算即可
        3.字符串連接
            只需要將變量與””符號連接起來運算即可
    數組操作
        在awk中數組叫做關聯數組,因爲下標既可以是數也可以是串。awk中的數組不必提前聲明,也不必聲明大小。數組元素用0或空串來初始化,這根據上下文而定。需要注意的是不同版本下面函數不一定相同。其相關的函數有length、asort、delete、split。當然也可以實現多維數組。
    流程控制語句
        1.條件判斷語句(if)
            if(表達式){語句1}else{語句2}
            if(表達式){語句1}else if(表達式){語句2}else{語句3}
        2.循環語句(while、for、do while)
            while(表達式){語句}
            for(變量 in 數組){語句}
            for(變量;條件;表達式){語句}
            do{語句}while(條件)
        3.關鍵字
            break:當break語句用於while或for語句時,導致退出程序循環。
            continue:當continue語句用於while或for語句時,使程序循環移動到下一個迭代。
            next:能能夠導致讀入下一個輸入行,並返回到腳本的頂部。這可以避免對當前輸入行執行其他的操作過程。
            exit:語句使主輸入循環退出並將控制轉移到END,如果END存在的話。如果沒有定義END規則,或在END中應用exit語句,則終止腳本的執行。
    正則表達式
        +:包含一個或多個字符或擴展正則表達式的具體值(在 +(加號)前)在這個字符串中,則字符串匹配。命令行:awk '/smith+ern/' testfile
        ?:包含零個或一個字符或擴展正則表達式的具體值(在 ?(問號)之前)在字符串中,則字符串匹配。命令行:awk '/smith?/' testfile
        |:以 |(垂直線)隔開的字符串的任何一個在字符串中,則字符串匹配。命令行:awk '/allen | alan /' testfile
        ():在正則表達式中將字符串組合在一起。命令行:awk '/a(ll)?/' testfile
        {m}:有m個模式的具體值位於字符串中,則字符串匹配。命令行:awk '/l{2}/' testfile
        {m,}:至少m個模式的具體值在字符串中,則字符串匹配。命令行:awk '/t{2,}/' testfile
        {m, n}:在m和n之間(包含的m和n)個模式的具體值在字符串中(其中m <= n),則字符串匹配。命令行:awk '/er{1, 2}/' testfile
        [String]:正則表達式與方括號內String變量指定的任何字符匹配。命令行:awk '/sm[a-h]/' testfile
        [^ String]:在 [ ](方括號)和在指定字符串開頭的 ^ (插入記號) 指明正則表達式與方括號內的任何字符不匹配。這樣,命令行:awk '/sm[^a-h]/' testfile
        ~,!~:表示指定變量與正則表達式匹配或不匹配的條件語句。命令行:awk '$1 ~ /n/' testfile
        ^:指定字段或記錄的開頭。命令行:awk '$2 ~ /^h/' testfile
        $:指定字段或記錄的末尾。命令行:awk '$2 ~ /y$/' testfile
        .:表示除了在空白末尾的終端換行字符以外的任何一個字符。命令行:awk '/a..e/' testfile
        \ :轉義字符。當位於在擴展正則表達式中具有特殊含義的任何字符之前時,轉義字符除去該字符的任何特殊含義。例如,命令行:/a\/\//
    內置函數
        1.算術函數
            atan2( y, x )     返回 y/x 的反正切。
            cos( x )     返回 x 的餘弦;x 是弧度。
            sin( x )     返回 x 的正弦;x 是弧度。
            exp( x )     返回 x 冪函數。
            log( x )     返回 x 的自然對數。
            sqrt( x )     返回 x 平方根。
            int( x )     返回 x 的截斷至整數的值。
            rand( )     返回任意數字 n,其中 0 <= n < 1。
            srand( [Expr] )     將 rand 函數的種子值設置爲 Expr 參數的值,或如果省略 Expr 參數則使用某天的時間。返回先前的種子值。
        2.字符串函數
            gsub( Ere, Repl, [ In ] )     除了正則表達式所有具體值被替代這點,它和 sub 函數完全一樣地執行,。
            sub( Ere, Repl, [ In ] )     用 Repl 參數指定的字符串替換 In 參數指定的字符串中的由 Ere 參數指定的擴展正則表達式的第一個具體值。sub 函數返回替換的數量。出現在 Repl 參數指定的字符串中的 &(和符號)由 In 參數指定的與 Ere 參數的指定的擴展正則表達式匹配的字符串替換。如果未指定 In 參數,缺省值是整個記錄($0 記錄變量)。
            index( String1, String2 )     在由 String1 參數指定的字符串(其中有出現 String2 指定的參數)中,返回位置,從 1 開始編號。如果 String2 參數不在 String1 參數中出現,則返回 0(零)。
            length [(String)]     返回 String 參數指定的字符串的長度(字符形式)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。
            blength [(String)]     返回 String 參數指定的字符串的長度(以字節爲單位)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。
            substr( String, M, [ N ] )     返回具有 N 參數指定的字符數量子串。子串從 String 參數指定的字符串取得,其字符以 M 參數指定的位置開始。M 參數指定爲將 String 參數中的第一個字符作爲編號 1。如果未指定 N 參數,則子串的長度將是 M 參數指定的位置到 String 參數的末尾 的長度。
            match( String, Ere )     在 String 參數指定的字符串(Ere 參數指定的擴展正則表達式出現在其中)中返回位置(字符形式),從 1 開始編號,或如果 Ere 參數不出現,則返回 0(零)。RSTART 特殊變量設置爲返回值。RLENGTH 特殊變量設置爲匹配的字符串的長度,或如果未找到任何匹配,則設置爲 -1(負一)。
            split( String, A, [Ere] )     將 String 參數指定的參數分割爲數組元素 A[1], A[2], . . ., A[n],並返回 n 變量的值。此分隔可以通過 Ere 參數指定的擴展正則表達式進行,或用當前字段分隔符(FS 特殊變量)來進行(如果沒有給出 Ere 參數)。除非上下文指明特定的元素還應具有一個數字值,否則 A 數組中的元素用字符串值來創建。
            tolower( String )     返回 String 參數指定的字符串,字符串中每個大寫字符將更改爲小寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 範疇定義。
            toupper( String )     返回 String 參數指定的字符串,字符串中每個小寫字符將更改爲大寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 範疇定義。
            sprintf(Format, Expr, Expr, . . . )     根據 Format 參數指定的 printf 子例程格式字符串來格式化 Expr 參數指定的表達式並返回最後生成的字符串。
        3.時間函數
            mktime( YYYY MM DD HH MM SS[ DST])     生成時間格式
            strftime([format [, timestamp]])     格式化時間輸出,將時間戳轉爲時間字符串,具體格式如下:
                %a     星期幾的縮寫(Sun)
                %A     星期幾的完整寫法(Sunday)
                %b     月名的縮寫(Oct)
                %B     月名的完整寫法(October)
                %c     本地日期和時間
                %d     十進制日期
                %D     日期 08/20/99
                %e     日期,如果只有一位會補上一個空格
                %H     用十進制表示24小時格式的小時
                %I     用十進制表示12小時格式的小時
                %j     從1月1日起一年中的第幾天
                %m     十進制表示的月份
                %M     十進制表示的分鐘
                %p     12小時表示法(AM/PM)
                %S     十進制表示的秒
                %U     十進制表示的一年中的第幾個星期(星期天作爲一個星期的開始)
                %w     十進制表示的星期幾(星期天是0)
                %W     十進制表示的一年中的第幾個星期(星期一作爲一個星期的開始)
                %x     重新設置本地日期(08/20/99)
                %X     重新設置本地時間(12:00:00)
                %y     兩位數字表示的年(99)
                %Y     當前月份
                %Z     時區(PDT)
                %%     百分號(%)
            systime()     得到時間戳,返回從1970年1月1日開始到當前時間(不計閏年)的整秒數
        4.其他函數
            close( Expression )     用同一個帶字符串值的 Expression 參數來關閉由 print 或 printf 語句打開的或調用 getline 函數打開的文件或管道。如果文件或管道成功關閉,則返回 0;其它情況下返回非零值。如果打算寫一個文件,並稍後在同一個程序中讀取文件,則 close 語句是必需的。
            system(Command )     執行 Command 參數指定的命令,並返回退出狀態。等同於 system 子例程。
            Expression | getline [ Variable ]     從來自 Expression 參數指定的命令的輸出中通過管道傳送的流中讀取一個輸入記錄,並將該記錄的值指定給 Variable 參數指定的變量。如果當前未打開將 Expression 參數的值作爲其命令名稱的流,則創建流。創建的流等同於調用 popen 子例程,此時 Command 參數取 Expression 參數的值且 Mode 參數設置爲一個是 r 的值。只要流保留打開且 Expression 參數求得同一個字符串,則對 getline 函數的每次後續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變量和 NF 特殊變量設置爲從流讀取的記錄。
            getline [ Variable ] < Expression     從 Expression 參數指定的文件讀取輸入的下一個記錄,並將 Variable 參數指定的變量設置爲該記錄的值。只要流保留打開且 Expression 參數對同一個字符串求值,則對 getline 函數的每次後續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變量和 NF 特殊變量設置爲從流讀取的記錄。
            getline [ Variable ]     將 Variable 參數指定的變量設置爲從當前輸入文件讀取的下一個輸入記錄。如果未指定 Variable 參數,則 $0 記錄變量設置爲該記錄的值,還將設置 NF、NR 和 FNR 特殊變量。
        5.排序函數
            asort:對數組的值進行排序,並且會丟掉原先鍵值;
            asorti:對數組的下標進行排序。

    例如
        1.內置變量
            a.$0
                awk '/^root/{print $0}' /etc/passwd  #/^root/爲選擇表達式,$0代表是逐行
            b.設置字段分隔符號(FS)
                awk 'BEGIN {FS=":"} /^root/ {print $1, NF}' /etc/passwd #FS爲字段分隔符,可以自己設置,默認是空格,因爲passwd裏面是”:”分隔,所以需要修改默認分隔符。NF是字段總數,$0代表當前行記錄,$1-$n是當前行,各個字段對應值。
            c.記錄條數(NR、FNR)
                awk 'BEGIN {FS=":"} {print NR, $1, FNR}' /etc/passwd #NR得到當前記錄所在行
            d.設置輸出字段分隔符(OFS)
                awk 'BEGIN {FS=":"; OFS="~~"} /^root/ {print FNR, $1, $NF}' /etc/passwd #OFS設置默認字段分隔符
            e.設置輸出行記錄分隔符(ORS)
                awk 'BEGIN {FS=":"; ORS="~~"} {print FNR, $1, $NF}' #ORS默認是換行符,這裏修改爲:”~~”,所有行之間用”~~”分隔了
            f.輸入參數獲取(ARGC,ARGV)
                awk 'BEGIN {FS=":"; print "ARGC="ARGC; for (k in ARGV) {print k"="ARGV[k];}}' /etc/passwd #ARGC得到所有輸入參數個數,ARGV獲得輸入參數內容,是一個數組
            g.獲得傳入的文件名(FILENAME)
                awk 'BEGIN {FS=":"; print FILENAME} {print FILENAME}' /etc/passwd #FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能獲得任何與文件記錄操作的變量。
            h.獲得linux環境變量(ENVIRON)
                awk 'BEGIN {print ENVIRON["PATH"];}' /etc/passwd #ENVIRON是子典型數組,可以通過對應鍵值獲得它的值。
            i.輸出數據格式設置(OFMT)
                awk 'BEGIN {OFMT="%.3f"; print 2/3,123.11111111;}' /etc/passwd #OFMT默認輸出格式是:%.6g 保留六位小數,這裏修改OFMT會修改默認數據輸出格式
            j.按寬度指定分隔符
                 echo 20100117054932 | awk 'BEGIN {FIELDWIDTHS="4 2 2 2 2 3"} {print $1"-"$2"-"$3,$4":"$5":"$6}' #FIELDWIDTHS其格式爲空格分隔的一串數字,用以對記錄進行域的分隔,FIELDWIDTHS="4 2 2 2 2 2"就表示$1寬度是4,$2是2,$3是2  .... 。這個時候會忽略:FS分隔符
            k.RSTART RLENGTH
                awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
                awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }' #RSTART被匹配正則表達式首位置,RLENGTH匹配字符長度,沒有找到爲-1.
        2.獲取外部變量
            a.獲取普通的外部變量
                test='awk code'
                echo | awk '{print test}' test="$test"
                echo | wawk 'BEGIN {print test}' test="$test" #傳入的變量可以在action中獲取值,但是變量名與值放到'{action}'後邊。其中BEGIN的action是不能獲得
            b.BEGIN程序塊的變量
                test='awk code'
                echo | awk -v test="$test" 'BEGIN {print test}'
                echo | awk -v test="$test" '{print test}' #用-v 傳入變量可以在3中類型的action 中都可以獲得到,但順序在  action前面
            c.獲得環境變量
                awk  'BEGIN {for (i in ENVIRON) {print i"="ENVIRON[i];}}'
        3.運算符
            a.賦值運算符、算術運算
                echo | awk 'BEGIN {a=1; b=5; c=3} {a+=5; b++; c--} END {print a, b, c, a*b}'
            b.邏輯運算符
                 awk 'BEGIN {a=1; b=2; print (a>5 && b<=2),(a>5 || b<=2);}'
            c.關係運算符
                awk 'BEGIN{a="11";if(a >= 9){print "ok";}}' #> < 可以作爲字符串比較,也可以用作數值比較,關鍵看操作數如果是字符串 就會轉換爲字符串比較。兩個都爲數字 才轉爲數值比較。字符串比較:按照ascii碼順序比較
            d.其它運算符
                awk 'BEGIN {a="b"; print a=="b" ? "ok" : "err";}'  #三目運算
                awk 'BEGIN {a="b"; arr[0]="b"; arr[1]="c"; print (a in arr);}' #判斷數組中是否存在該鍵值
        3.字符操作
            a.字符串轉數字
                awk 'BEGIN {a="100"; b="10test10"; print (a+b+0);}'
                awk 'BEGIN {a="100"; b="10test10"; print a+b+0;}'
            b.數字轉字符串
                awk 'BEGIN {a=100; b=100; c=(a""b); print c}'
                awk 'BEGIN {a=100; b=100; c=a""b; print c}'
            c.字符串連接
                awk 'BEGIN {a="a"; b="b"; c=a""b; print c}'
        3.數組操作
            a.賦值
                awk 'BEGIN {tB["a"]="a1"; tB["b"]=1;}'
            b.數組長度(length)
                awk 'BEGIN {tB["a"]="a1"; tB["b"]=1; print length(tB)}'
                awk 'BEGIN {info="it is a test"; split(info,tA," "); print asort(tA);}'  #asort對數組進行排序,返回數組長度
            c.字符串分割爲數組(split)
                awk 'BEGIN {info="it is a test"; lens=split(info,tA," "); print length(tA), lens;}' #length返回字符串以及數組長度,split進行分割字符串爲數組,也會返回分割得到數組長度
            d.數組輸出
                awk 'BEGIN {info="it is a test"; split(info,tA," "); for(k in tA){print k, tA[k];}}' #for…in 輸出,因爲數組是關聯數組,默認是無序的。
                awk 'BEGIN {info="it is a test"; tlen=split(info,tA," "); for(k=1; k<=tlen; k++){print k, tA[k];}}' #如果需要得到有序數組,需要通過下標獲得。數組下標是從1開始,與c數組不一樣
            e.判斷鍵值是否存在
                awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; if(tB["c"]!="1"){print "no found";}; for(k in tB){print k,tB[k];}}' #tB[“c”]沒有定義,但是循環時候,發現已經存在該鍵值,它的值爲空,這裏需要注意,awk數組是關聯數組,只要通過數組引用它的key,就會自動創建改序列
                 awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; if( "c" in tB){print "ok";}; for(k in tB){print k,tB[k];}}' #if(key in array) 通過這種方法判斷數組中是否包含”key”鍵值,才能正確的判斷
            f.刪除鍵值
                awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; delete tB["a"]; for(k in tB){print k, tB[k];}}'
            g.二維數組
                awk 'BEGIN{
                    for(i=1;i<=9;i++)
                    {
                      for(j=1;j<=9;j++)
                      {
                    tarr[i,j]=i*j;
                    print i,"*",j,"=",tarr[i,j];
                      }
                    }
                    }'
                #array[k,k2]引用獲得數組內容
        4.流程控制操作
            a.awk 'BEGIN{
                    score=100;
                    if(score>90)
                    {
                        print "優秀";
                    }
                    else if(score>80)
                    {
                        print "良好";
                    }
                    else if(score>70)
                    {
                        print "普通";
                    }
                    else if(score>60)
                    {
                        print "及格";
                    }else
                    {
                        print "不及格";
                    }
                    }'
            b.awk 'BEGIN{
                    total=0;
                    while(i<=100)
                    {
                        total+=i;
                        i++;
                    }
                    print total;
                    }'
            c.awk 'BEGIN{
                    for(k in ENVIRON)
                    {
                        print k"="ENVIRON[k];
                    }
                    }'  #ENVIRON是awk常量,是數組
            d.awk 'BEGIN{
                    total=0;
                    for(i=0;i<=100;i++)
                    {
                        total+=i;
                    }
                    print total;
                    }'
            e.awk 'BEGIN{
                    total=0;
                    i=0;
                    do
                    {
                        total+=i;
                        i++;
                    }while(i<=100)
                    print total;
                    }'
        5.內置函數
            a.算術函數
                awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' #OFMT 設置輸出數據格式是保留3位小數
                awk 'BEGIN{srand();fr=int(100*rand());print fr;}' #獲得隨機數
            b.字符串函數
                awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' #在 info中查找滿足正則表達式,/[0-9]+/ 用””替換,並且替換後的值,賦值給info 未給info值,默認是$0
                awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
                awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'  #正則匹配
                awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' #從第 4個 字符開始,截取10個長度字符串
                awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' #分割info,動態創建數組tA
            c.時間函數
                awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'
                awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' #求2個時間段中間時間差
            d.其他函數
                awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' #打開外部文件
                awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' #逐行讀取外部文件
                awk 'BEGIN{print "Enter your name:";getline name;print name;}'
                awk 'BEGIN{b=system("ls -al");print b;}' #調用外部應用程序
        6.輸出函數
            a.printf
                awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}' #類似於C語音
        7.awk腳本
            #!/bin/awk -f
            BEGIN{
                for(i=1;i<=9;i++)
                    {
                        for(j=1;j<=9;j++)
                        {
                            tarr[i,j]=i*j;
                            print i,"*",j,"=",tarr[i,j];
                        }
                    }
            }

    注意
        1.在awk中有兩個特別的表達式,BEGIN和END,這兩者都可用於pattern中,提供BEGIN和END的作用是給程序賦予初始狀態和程序結束之後執行一些掃尾的工作。任何在BEGIN之後列出的操作(在{}內)將在awk開始掃描輸入之前執行,而END之後的操作將在掃描完全部的輸入之後執行。因此通常BEGIN來顯示變量和初始化變量,使用END來輸出最終結果。
        2.awk中數據類型,是不需要定義,自適應的。 有時候需要通過(+、"")強制轉換。
        3.awk數組下標是從1開始,與c數組不一樣。
        4.awk的多維數組在本質上是一維數組,更確切一點,awk在存儲上並不支持多維數組。awk提供了邏輯上模擬二維數組的訪問方式。例 如,array[2,4] = 1這樣的訪問是允許的。awk使用一個特殊的字符串SUBSEP (\034)作爲分割字段,在上面的例子中,關聯數組array存儲的鍵值實際上是2\0344。多維數組可以使用if((i,j) in array)這樣的語法,但是下標必須放置在圓括號中。多維數組使用 for ( item in array )這樣的語法遍歷數組。與一維數組不同的是,多維數組必須使用split()函數來訪問單獨的下標分量。split ( item, subscr, SUBSEP)
        5.awk實現的性能是比shell實現的強
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章