免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5857 | 回复: 5

awk中的函数使用 [复制链接]

论坛徽章:
0
发表于 2009-04-08 14:55 |显示全部楼层
这两天突然发现awk中的函数也挺好用!而且能把awk代码写得更加清晰,与各位分享一下!

1、awk的函数可以在引号中的任意地方定义,用{}括起即可,可以定义参数,但调用时可带可不带:
如:显示每行前两个域的较大值的函数如下:
  1. awk '
  2. function max(a,b,c)
  3. {
  4. return a>b?a:b
  5. }
  6. {print max($1,$2)}' file
复制代码

说明:显示每行前两个域的较大值,max为函数名,a、b为参数,(类似于c语言的形参)

2、函数可以直接使用awk中的变量,包括域变量($1、$2...)和自定义变量,如果是直接使用,则函数中对变量的赋值
   将影响该变量的值,如果是通过参数调用的方式,则不会影响;

file的内容:400
  1. awk '
  2. function b()
  3. {
  4. print "b.in.$1="$1;
  5. }
  6. ####MAIN
  7. {
  8. v=100; y=200
  9. print "a.in.v="v;
  10. print "a.in.y="y;
  11. a(y)b()
  12. print "a.out.v="v;
  13. print "a.out.y="y;
  14. }
  15. function a(y)
  16. {
  17. print "(a)v="v;
  18. v=v+$1+y;
  19. y=300;
  20. }' file
复制代码

结果:
  1. a.in.v=100
  2. a.in.y=200
  3. (a)v=100
  4. b.in.$1=400
  5. a.out.v=700
  6. a.out.y=200
复制代码

变量v的值在函数a中发生了变化,并体现在了主函数中,但变量y是作为函数的a的形参,在函数a中对y的修改
无法体现在主函数中,对于没有参数的函数,在调用时要用(),并且可以不加分号。

3、总之,awk中的函数与shell中的函数使用有类似之处,可以变量都是全局使用,在函数中对变量的修改将同时影响主程序;
   可以使程序模块化,更加简化和美观,但也有不同之处,如awk中的函数定义位置更灵活(shell中必须在调用之前定义),
   参数的使用方法更灵活!

欢迎各位补充指正,我也是刚刚开始使用!

论坛徽章:
0
发表于 2009-04-08 17:18 |显示全部楼层
向楼主学习
awk是强大的

论坛徽章:
1
处女座
日期:2014-12-23 17:59:27
发表于 2009-04-08 17:31 |显示全部楼层
呵呵, 这个可以man的。。

论坛徽章:
0
发表于 2009-04-08 19:09 |显示全部楼层
awk函数复用性不是很好 如果能像C一样可以通过include获得函数定义就好了

论坛徽章:
0
发表于 2009-04-08 19:10 |显示全部楼层
而且有个不利的地方就是函数里面的参数默认是全局的,要使用局部变量只能在参数里面声明

如果能加上个local关键字就好了

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2009-04-09 13:32 |显示全部楼层
原帖由 皇家救星 于 2009-4-8 19:10 发表
而且有个不利的地方就是函数里面的参数默认是全局的,要使用局部变量只能在参数里面声明

如果能加上个local关键字就好了

的确,这一点很让人郁闷,至少不太好递归了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP