你好,游客 登录 注册 搜索
背景:
阅读新闻

awk-语法深入-用户自定义函数

[日期:2017-01-09] 来源:Linux社区  作者:cooling88 [字体: ]

- 自定义函数格式

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: %d\n",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: %d\n", n, fibonacci(n))
  12.  }  
  13. 问题: 复杂度大,求第n项时需要把前n-1项都计算一遍!
解决:使用数组,把所有求过的项保存起来,再求新的项时,直接调用。
 
总结: print 与 printf 的区别:
 
  print 输出的内容后会自动换行
  printf 不会自动换行,需要添加'\n';还可以自定义输出格式.
 
  1. [root@web1 function]# echo -e "1\n2\n34\n43\n23"|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 "1\n2\n34\n43\n23"|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 "1\n2\n34\n43\n23"|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

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款