AWK高階之內部函式使用

wmsok發表於2015-10-30

點選(此處)摺疊或開啟

  1. 函式    說明    例句說明    
  2. gsub( Ere, Repl, [ In ] )    全域性替換,除了正規表示式所有具體值被替代這點,它和sub 函式完全一樣地執行,。    例句:gsub(/[0-9]+/,"!",info)    
  3. sub( Ere, Repl, [ In ] )
  4. gensub(Ere, Repl, h, [In])    sub:第一次出現的替換,用 Repl 引數指定的字串替換 In 引數指定的字串中的由 Ere 引數指定的擴充套件正規表示式的第一個具體值。sub 函式返回替換的字元數量。出現在 Repl引數指定的字串中的 &(和符號)由 In 引數指定的與Ere 引數的指定的擴充套件正規表示式匹配的字串替換。如果未指定 In 引數,預設值是整個記錄($0 記錄變數)。
  5. gensub:類似於sub,但是h引數可以控制替換的位置,g/G全域性替換,h為數字表示替換第幾次出現的位置,具體檢視man awk    說明:這時可以用正規表示式,但在awk中的匹配都是用//引起來的,比如/;$/ 以分號結尾,/^#/以#開頭;
  6. 更新通配出來的字元,用\(..\) 或者 &
  7. 還可以統計每一行字元出現的次數;    
  8. index( String1, String2 )    在由 String1 引數指定的字串(其中有出現 String2 指定的引數)中,返回位置,從 1 開始編號。如果 String2引數不在 String1 引數中出現,則返回 0(零)。    略    
  9. length [(String)]    返回 String 引數指定的字串的長度(字元形式)。如果未給出 String 引數,則返回整個記錄的長度($0 記錄變數)。    略    
  10. blength [(String)]    返回 String 引數指定的字串的長度(以位元組為單位)。如果未給出 String 引數,則返回整個記錄的長度($0 記錄變數)。    略    
  11. substr( String, M, [ N ] )    返回具有 N 引數指定的字元數量子串。子串從 String 引數指定的字串取得,其字元以 M 引數指定的位置開始。M引數指定為將 String 引數中的第一個字元作為編號 1。如果未指定 N 引數,則子串的長度將是 M 引數指定的位置到String 引數的末尾 的長度。    substr(a,4,10)    
  12. match( String, Ere )
  13. 可以使用'~'
  14. $0 ~ /partern/    在 String 引數指定的字串(Ere 引數指定的擴充套件正規表示式出現在其中)中返回位置(字元形式),從 1 開始編號,或如果 Ere 引數不出現,則返回 0(零)。RSTART特殊變數設定為返回值。RLENGTH 特殊變數設定為匹配的字串的長度,或如果未找到任何匹配,則設定為 -1(負一)。    if (match($0,/31/)    
  15. split( String, A, [Ere] )    將 String 引數指定的引數分割為陣列元素 A[1], A[2], . . ., A[n],並返回 n 變數的值。此分隔可以通過 Ere 引數指定的擴充套件正規表示式進行,或用當前欄位分隔符(FS 特殊變數)來進行(如果沒有給出 Ere 引數)。除非上下文指明特定的元素還應具有一個數字值,否則 A 陣列中的元素用字串值來建立。    awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'    
  16. tolower( String )    返回 String 引數指定的字串,字串中每個大寫字元將更改為小寫。大寫和小寫的對映由當前語言環境的LC_CTYPE 範疇定義。    略    
  17. toupper( String )    返回 String 引數指定的字串,字串中每個小寫字元將更改為大寫。大寫和小寫的對映由當前語言環境的LC_CTYPE 範疇定義。    略    
  18. sprintf(Format, Expr, Expr, . . . )    根據 Format 引數指定的 printf 子例程格式字串來格式化 Expr 引數指定的表示式並返回最後生成的字串。    詳見下面的表格    

  19. 下面著重講sub的修改字串與統計字串以及split功能

  20. 1、gsub求每行出現數字1的次數

  21. awk '{a+=gsub(/1/,"&");print a;a=0}' cs.txt
  22.    ---gsub的特性每匹配成功一個就返回1,所以就可以累加了;這裡不能用sub,因為sub只匹配第一個;
  23.    ---也不能用match函式,因為他返回位置並且找到1個就可以了,因為match的目的是找到要匹配的行,而非是字元

  24. 2、gsub修改字串
  25. [root@wmsvmpc ~]# cat cs.txt
  26. PBCSPOFT0101 96
  27. PBCSPOFT0102 6
  28. PBCSPOFT0103 8
  29. PBCSPOFT0104 0
  30. PBCSPOFT0105 0
  31. PBCSPOFT0106 0

  32. [root@wmsvmpc ~]# awk '{a=gensub(/PBCSPOFT([0-9]+).*/,"\\1",1);print a}' cs.txt --gensub不能改變awk中已經定義的$0,$1-$n的值,所以得重定義
  33. 0101
  34. 0102
  35. 0103
  36. 0104
  37. 0105
  38. 0106
  39.     ----gensub使用()的方式來儲存變數值,用\\1的方式引用變數值,而gsub用&來引用變數值
  40.     [root@wmsvmpc ~]# awk '{gsub(/([0-9]+)/,"#&");print}' cs.txt ---gsub只能替換所有的
  41. PBCSPOFT#0101 #96
  42. PBCSPOFT#0102 #6
  43. PBCSPOFT#0103 #8
  44. PBCSPOFT#0104 #0
  45. PBCSPOFT#0105 #0
  46. PBCSPOFT#0106 #0

  47. [root@wmsvmpc ~]# awk '{a=gsub(/([0-9]+)/,"&");print a}' cs.txt ---gsub返回的是成功的個數,所以無法單獨提取匹配的數字
  48. 2
  49. 2
  50. 2
  51. 2
  52. 2


  53. 3、split分割成陣列
  54. 分割info,動態建立陣列tA,這裡比較有意思,awk for …in 迴圈,是一個無序的迴圈。 並不是從陣列下標1…n ,因此使用時候需要注意。
  55. 使用split返回字串陣列元素個數。工作方式如下:如果有一字串,包含一指定分隔符-,例如AD2-KP9-JU2-LP-1,將之劃分成一個陣列。使用split,指定分隔符及陣列名。此例中,命令格式為("AD2-KP9-JU2-LP-1",parts_array,"-"),split然後返回陣列下標數,這裡結果為4。還有一個例子使用不同的分隔符。

  56. [root@wmsvmpc ~]# awk 'BEGIN {print split("123#456#678", myarray, "#")}'
  57. 3
  58. [root@wmsvmpc ~]# awk 'BEGIN{{print split("123#456#678", myarray, "#")}{for (i in myarray) print i,myarray[i]}}' ---可以看出來split返回的是元素的個數
  59. 3
  60. 1 123
  61. 2 456
  62. 3 678

  63. SPRINTF 格式化字串輸出 (sprintf有一個秒用,當變數後面不跟\n時列印的字串都在一行的,所以就能快速實現拼接)
  64. 其中格式化字串包括兩部分內容: 一部分是正常字元, 這些字元將按原樣輸出; 另一部分是格式化規定字元,"%"開始, 後跟一個或幾個規定字元,用來確定輸出內容格式。
  65.  
  66.  
  67. 格式符    說明    
  68. %d    十進位制有符號整數    
  69. %u    十進位制無符號整數    
  70. %f    浮點數    
  71. %s    字串    
  72. %c    單個字元    
  73. %p    指標的值    
  74. %e    指數形式的浮點數    
  75. %x    %X 無符號以十六進位制表示的整數    
  76. %o    無符號以八進位制表示的整數    
  77. %g    自動選擇合適的表示法    
  78. [chengmo@centos5 ~]$ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'
  79. 124.11,18446744073709551615,1.2,7C,174

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25960404/viewspace-1818872/,如需轉載,請註明出處,否則將追究法律責任。

相關文章