用户自定义函数(User-Defined Functions)

Awk 允许用户定义自己的函数,提高代码的可读性复用性

1. 函数定义

函数的定义必须在模式(pattern)和动作(action)之外

function <函数名>(<参数1>, <参数2>, ...) { <函数体> }

例如,下面的 Awk 代码计算前两个字段的平方和

function print_sumsq(x, y) {
    print x*x + y*y
}

NF >= 2 { print_sumsq($1, $2) }

示例输入:

3 4
5 12
8 15

输出:

25
169
289

2. 调用函数的注意事项

  • 用户自定义函数调用时,函数名与左括号 ( 之间不能有空格,否则 Awk 会误认为是字符串拼接
NF >= 2 { print_sumsq($1, $2) }  # ✅ 正确
NF >= 2 { print_sumsq ($1, $2) } # ❌ 错误(多了空格)
  • 系统内置函数(如 atan2)不受此限制:
NF >= 2 { print(atan2($1, $2)) }    # ✅ 正确
NF >= 2 { print(atan2 ($1, $2)) }   # ✅ 也正确

3. 返回值

使用 return 语句返回值:

function sumsq(x, y) {
    return x*x + y*y
}

NF >= 2 { print(sumsq($1, $2)) }

示例输入:

3 4
5 12
8 15

输出:

25
169
289

4. 局部变量

  • 在函数参数列表最后声明局部变量(以额外空格与参数分隔):
function sumsq(x, y,   u, v) {  # u, v 是局部变量
    u = x*x
    v = y*y
    return u + v
}

NF >= 2 { print(sumsq($1, $2)) }

注意:调用函数时不能传递局部变量


5. 间接函数调用(GNU Awk 扩展)

  • gawk 中,可以使用 @变量名(参数) 进行间接调用
function print_sumsq(x, y) {
    print x*x + y*y
}

BEGIN {
    myfun = "print_sumsq"
}

NF >= 2 { @myfun($1, $2) }

示例输入:

3 4
5 12

输出:

25
169

练习

  1. 定义一个函数,计算三角形面积
function triangle_area(base, height) {
    return 0.5 * base * height
}

NF >= 2 { print "Area:", triangle_area($1, $2) }

输入:

10 5
8 12

输出:

Area: 25
Area: 48
  1. 定义一个函数,将字符串转换为标题格式(首字母大写)
function title_case(s) {
    return toupper(substr(s, 1, 1)) substr(s, 2)
}

{ print title_case($0) }

输入:

hello
awk scripting

输出:

Hello
Awk scripting

总结

功能 示例
定义函数 function sumsq(x, y) { return x*x + y*y }
调用函数 sumsq(3, 4)
返回值 return x*x + y*y
局部变量 function test(a, b, x, y) { x=a+b; y=a-b; return x*y }
间接调用(gawk) @myfun($1, $2)

下一章,我们将学习 Awk 的高级模式匹配(Pattern Matching) 🚀

最后修改: 2025年01月30日 星期四 01:07