回到:


awk 自定义函数

可以定义一个函数将多个操作整合在一起。函数定义之后,可以到处多次调用,从而方便复用。

使用function关键字来定义函数:

1
2
3
function func_name([parameters]){
function_body
}

对于gawk来说,也支持func关键字来定义函数。

1
func func_name(){}

函数可以定义在下面使用下划线的地方:

1
awk '_ BEGIN{} _ MAIN{} _ END{} _'

无论函数定义在哪里,都能在任何地方调用,因为awk在BEGIN之前,会先编译awk代码为内部格式,在这个阶段会将所有函数都预定义好。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
awk '
BEGIN{
f()
f()
f()
}
function f(){
print "星期一"
print "星期二"
print "星期三"
print "星期四"
print "星期五"
print "星期六"
print "星期日"
}
'

awk 函数的return语句

如果想要让函数有返回值,那么需要在函数中使用return语句。

return语句也可以用来立即结束函数的执行。

例如:

1
2
3
4
5
6
7
8
9
10
awk '
function add(){
return 40
}
BEGIN{
print add()
res = add()
print res
}
'

如果不使用return或return没有参数,则返回值为空,即空字符串。

1
2
3
4
5
6
7
8
9
10
awk '
function f1(){ }
function f2(){return }
function f3(){return 3}
BEGIN{
print "-"f1()"-"
print "-"f2()"-"
print "-"f3()"-"
}
'

awk函数参数

为了让函数和调用者能够进行数据的交互,可以使用参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
awk '
function f(a,b){
print a
print b
return a+b
}
BEGIN{
x=10
y=20
res = f(x,y)
print res
print f(x,y)
}
'

例如,实现一个重复某字符串指定次数的函数:

1
2
3
4
5
6
7
8
9
10
11
12
awk '
function repeat(str,cnt ,res_str){
for(i=0;i<cnt;i++){
res_str = res_str""str
}
return res_str
}
BEGIN{
print repeat("abc",3)
print repeat("-",30)
}
'

调用函数时,实参数量可以比形参数量少,也可以比形参数量多。但是,在多于形参数量时会给出警告信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
awk '
function f(a,b){
print a
print b
return a+b
}
BEGIN{
x=10
y=20

print "---1----"
print "-"f()"-" # 不传递参数

print "---2----"
print "-"f(30)"-" # 传递1个参数

print "---3----"
print "-"f(10,20,30)"-" # 传递多个参数
}
'

awk函数参数数据类型冲突问题

如果函数内部使用参数的类型和函数外部变量的类型不一致,会出现数据类型不同而导致报错。

1
2
3
4
5
6
7
8
9
10
11
12
awk '
function f(a){
a[1]=30
}
BEGIN{
a="hello world"
f(a) # 报错

f(x)
x=10 # 报错
}
'

函数内部参数对应的是数组,那么外面对应的也必须是数组类型。

awk参数按值传递还是按引用传递

在调用函数时,将数据作为函数参数传递给函数时,有两种传递方式:

  • 传递普通变量时,是按值拷贝传递
    • 直接拷贝普通变量的到函数中
    • 函数内部修改不会影响到外部
  • 传递数组时,是按引用传递
    • 函数内部修改会影响到外部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 传递普通变量:按值拷贝
awk '
function modify(a){
a=30
print a
}
BEGIN{
a=40
modify(a)
print a
}
'

# 传递数组:按引用拷贝
awk '
function modify(a){
a[1]=20
}

BEGIN{
a[1]=10
modify(a)
print a[1]
}
'