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.函数参数
1. echo “12 23”| awk '
2. function max(a,b,c)
3. {
4. a = 1; b = 2; c = 3;
5. print a,b,c
6. return a > b ? a : b;
7. }
8. {print max($1,$2);print a,b,c}'
结果:
1. 1 2 3
2. 2
3.
从结果可以看出function max(a,b,c)都成为了局部变量。
4、总结
(1)awk中的函数与shell中的函数使用有类似之处,函数里面的参数默认是全局的,要使用局部变量只能在参数里面声明,在函数中对变量的修改将同时影响主程序,shell函数中可以使用local关键字来定义局部变量;
(2)可以使程序模块化,更加简化和美观,但也有不同之处,如awk中的函数定义位置更灵活(shell中必须在调用之前定义);
(3)$0,$1,$2...默认是全部脚本使用,无论在函数内还是函数外,可以认为是全局的;
(4)function max(a,b,c) 如果在传入参数的时候未传入第三个参数那么默认第三个参数为函数内部的变量,即是局部变量;
(5)函数返回值使用 res = max(a,b,c);
(6)函数的参数如果是标量则是传值,数组则是传引用,函数中改变数组的值可以改变全局数组中的值;