Awk入门
Completion requirements
用户自定义函数(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
练习
- 定义一个函数,计算三角形面积
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
- 定义一个函数,将字符串转换为标题格式(首字母大写)
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) 🚀
Last modified: Thursday, 30 January 2025, 1:07 AM