首頁 > 軟體

awk-語法深入-使用者自定義函數

2020-06-16 17:23:48

- 自定義函數格式

awk 自定義函數獲取引數,選擇性的返回標量值,函數可以在程式的頂層任意位置定義。自定義格式為:
  1.   function name(arg1,arg2,....argn){
  2.       statement(s)
  3.   }
  在自定義的函數中,指定的引數被當作區域性變數,他們會隱藏任何同名的全域性性變數。
呼叫函數的格式:
  1.  functionexpr1expr2,...)# 忽略任何返回值
  2.  result=functionexpr1expr2,...)# 將返回值儲存在變數中
 
 自定義函數時,所有位於函數體內部且未出現在函數參數列中的變數,awk都將視之為全域性變數。
  awk允許呼叫函數時,被呼叫函數中的引數比它定義時所宣告的引數還少,這樣額外的引數(既沒有被傳遞值的引數)被視為區域性變數,對於這類變數,一般將它列在自定義的函數的參數列,並且字首前置一些空白。這個額外的引數通常初始化為空字串.
eg.
  1.  funchtion add(x,y  sum) // sum 就是一個區域性變數,初始化為空字串
  2. {
  3.     sum=x+y
  4.     return sum /
  5. }
  6. a=add(1,2)  // 傳遞的引數少於函數add()定義時的數量
  7. printf("m: %dn",a)
 
 
- 值傳遞和地址傳遞(參照傳遞):
   值傳遞是將變數的值傳給了函數的形參,變數本身並未改變,還是原來的值。
   地址傳遞是將變數的地址傳遞給了函數的形參,被呼叫函數會通過變數的地址找到變數被定義的地方,進而對變數作出改動,與變數的值改變。
awk不支援取址操作,因此awk中普通變數為值傳遞,awk的陣列則預設為地址傳遞。
 
- 遞回呼叫 
  awk函數支援自己呼叫自己。
  應用場景: 某些不斷執行相同邏輯的的程式.
 eg. 求斐波那契數列(Fibonacci sequence)的某一項
fibonacci.awk
  1.  function fibonacci(nth)
  2.  {
  3.      if(nth ==1|| nth ==2) 
  4.         return1
  5.      else
  6.         return  fibonacci(nth-1)+ fibonacci(nth-2)  // 遞回
  7.  }
  8. ######執行體###########################
  9.  {
  10.     n=$1  // 第一個欄位
  11.     printf(" %dth of fibonacci sequence is: %dn", n, fibonacci(n))
  12.  }  
  13. 問題: 複雜度大,求第n項時需要把前n-1項都計算一遍!
解決:使用陣列,把所有求過的項儲存起來,再求新的項時,直接呼叫。
 
總結: print 與 printf 的區別:
 
  print 輸出的內容後會自動換行
  printf 不會自動換行,需要新增'n';還可以自定義輸出格式.
 
  1. [root@web1 function]# echo -e "1n2n34n43n23"|awk '{print "Number is: " $1}'
  2. Number is:1
  3. Number is:2
  4. Number is:34
  5. Number is:43
  6. Number is:23
  7. [root@web1 function]# echo -e "1n2n34n43n23"|awk '{printf "Number is: " $1;} END{printf "n"}'
  8. Number is:1Number is:2Number is:34Number is:43Number is:23
  9. [root@web1 function]# echo -e "1n2n34n43n23"|awk '{printf "Number is: " $1 "n"}'
  10. Number is:1
  11. Number is:2
  12. Number is:34
  13. Number is:43
  14. Number is:23

Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm

Linux系統之文字格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK簡介及使用範例 http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文字分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文字處理工具之awk  http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文字分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

AWK入門基礎教學  http://www.linuxidc.com/Linux/2016-12/138138.htm

使用awk格式化輸出文字 http://www.linuxidc.com/Linux/2016-04/130193.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-01/139372.htm


IT145.com E-mail:sddin#qq.com