脚本中凡是可以出现模式操作规则的位置都可以放置用户自定义的函数。
格式
函数名(参数,参数,参数, ...){
语句
return 表达式
(注: return语句和表达式都是可选项)
}
变量以参数值的方式传递,且仅在使用它的函数中局部有效。函数使用的只是变量的副本。数组则通过地址或引用被传递,因此,可以在函数中直接修改数组的元素。函数中的任何变量,只要不是从参数列表中传来的,就都被视为全局变量,也就是说,该变量对整个awk程序都是可见的,而且,如果它在函数中发生了改变,即在整个程序中发生了改变。在函数中提供局部变量的唯一途径就是将它加入参数列表中。这类参数通常放在参数列表的末端。当调用函数时,如果没有指定某个形参的值,该参数就会被初始化为空。return语句会把控制权交还给调用者,可能还会返回一个值。
范例
$ cat grades
44 55 66 22 77 99
100 22 77 99 33 66
55 66 100 99 88 45
$ cat sorter.sc
# Scriptname: sorter
# It sorts numbers in ascending order
function sort (scores , num_elements , tmp , i , j) {
# temp, i , and j will be local and private,
# with an initial value of null.
for( i = 2;
i <= num_elements ; ++i ) {
for ( j = i;
scores [j-1] > scores[j]; --j ) {
temp = scores[j]
scores[j] = scores[j-1]
scores[j-1] = temp
}
}
}
{for ( i = 1;
i <= NF; i++){
grades[i]=$i
}
sort(grades, NF) #Two
arguments are psssed
for ( j = 1;
j <= NF; ++j )
printf("%d", grades[j])
printf ("\n")
}
$ awk -f sorter.sc grades
22 44 55 66 77 99
22 33 66 77 99 100
45 55 66 88 99 100
说明
1.定义名为sort的函数,函数定义可以出现在脚本的任意位置,除了那些作为参数传递的变量外,所有其他变量的域都是全局的。即如果在函数中发生了变化,也就在整个awk脚本中发生了变化。数组是通过引用进行传递的。圆括号中共有5个形参,其中数组scores将通过引用被传递,所以,如果在函数中修改了这个数组中任何一个元素,原来的数组也会被修改.变量num_elements是一个局部变量,是原变量的一个副本。变量temp、i和j则是函数的局部变量。
2.外层的for循环将遍历一个整数数组,前提是该数组中至少有两个整数可用于比较。
3.内层的for循环用当前这个整数与数组中前一个整数(scores[j-1])进行比较。如果前一个整数大于当前这个整数,就把当前这个数组元素的值赋给变量temp。然后把前一个元素的值赋给当前元素。
4.外层循环至此结束.
5.函数定义的末尾.
6.脚本的第一个操作块由此开始。for循环遍历当前记录的所有字段,生成一个整数数组。
7.调用sort函数,把由当前记录生成的整数数组和当前记录的字段数作为参数传给它。
8.sort函数结束后,程序控制由此开始。这个for循环用于打印完成排序的数组中的元素。
参考资料:http://www.linuxawk.com/jiaocheng/321.html