Linux操作系统的操作和文本处理的用法,我们在前几期的笔记中多多少少都涉及了一些,有需要的朋友们,欢迎到我主页查看Linux详细的笔记。
现在我们开始分享Linux能够作为一门编程语言的高级用法,用户自定义函数。关于函数作用,函数不仅提高了代码的复用度也提高代码的鲁棒性。
1.简介
先看语法:
function function_name(argument1, argument2, ...)
{
function body
}
如果有学过C语言,这里就十分相似。没有的话,也不用担心,我也尽量讲明白:
其中:
- function:awk保留字,声明,就是告诉系统,如果看到了function,后面紧接着要定义一个函数。
- function_name:是用户定义的函数名。函数名应以字母开头,可包含数字、字母或下划线。不可使用 AWK 的保留关键字。
- 参数:自定义函数可接受多个参数,用逗号分隔。参数非必需。
- function body :函数体,包含函数的AWK代码部分,主要的代码就在这里。
awk用户自定义函数可以在awk脚本的任何位置定义,也可以放在单独的文件中。
那么现在我们再此回忆一下,awk的工作流程,如下图:
我们以及提过很多次了,这里AWK的工作流程:BEGIN块开始,循环执行BODY块,最后执行END块。
如果需要看看:CSDN
下面的示例代码都是在这个逻辑上写的。
2.示例代码
示例1:计算平均值
假设我们有一个文件`file.txt`,内容如下:
张三 男 20
李四 女 21
王五 男 22
赵老六 女 21
钱老七 男 25
现在我们想要计算这些学生的平均年龄。我们可以使用一个自定义函数来完成这个任务。
创建一个calculate_avg.awk文件,内容如下:
# 定义计算平均年龄的函数
function calculate_average(total, count) {
return total / count
}
# 主程序
{
total += $3 # 将第二列成绩累加到total变量中
count++ # 计数器加一
}
# 结束后输出平均年龄
END {
avg = calculate_average(total, count)
print "平均年龄:", avg
}
要运行这个`awk`脚本,可以使用以下命令:
# 使用-f 指定awk脚本
awk -f calculate_avg.awk file.txt
# 输出结果如下:
平均年龄: 21.8
示例2:查找特定行
还是上面的文件`file.txt`,内容如下:
张三 男 20
李四 女 21
王五 男 22
赵老六 女 21
钱老七 男 25
现在我们想要查找年龄大于21的学生。我们可以定义一个自定义函数来完成这个任务。
# 定义查找大于指定分数的函数
function find_students(age) {
if ($3 > age) {
print $0
}
}
# 主程序,查找大于21岁的学生
{
find_students(21)
}
同样,要运行这个`awk`脚本,可以使用以下命令:
# 使用函数脚本
awk -f find_students.awk file.txt
# 输出结果如下:
王五 男 22
钱老七 男 25
示例3:格式化输出
还是上面的文件`file.txt`,内容如下:
张三 男 20
李四 女 21
王五 男 22
赵老六 女 21
钱老七 男 25
现在我们想要将每个年龄标记出来。我们可以定义一个自定义函数来完成这个任务。
# 定义格式化函数
function format_age(amount) {
return "年龄:" amount
}
# 主程序,格式化输出
{
printf "%s\t%s\n", $1, format_age($3)
}
运行这个`awk`脚本:
# 使用脚本函数
awk -f format_age.awk file.txt
# 输出如下:
张三 年龄:20
李四 年龄:21
王五 年龄:22
赵老六 年龄:21
钱老七 年龄:25
3.经典示例:九九乘法表
当然,学习代码,最经典的当时要打印九九乘法表了,下面我们来试试。创建一个multiplication_table.awk文件:
# 九九乘法表
function multiply(a, b) {
return a * b
}
BEGIN {
for (i = 1; i <= 9; i++) {
for (j = i; j <= 9; j++) {
printf "%dx%d=%-2d ", i, j, multiply(i, j)
}
printf "\n"
}
}
在这个脚本中:
multiply
函数接受两个参数a
和b
,返回它们的乘积。- 在
BEGIN
块中,使用两个嵌套的for
循环来遍历乘法表的每一行和列。 - 在内部循环中,使用
printf
打印乘法表的每个元素,调用multiply
函数来计算乘积,并使用%d
来格式化输出。 - 内部循环的起始值
j
被设置为i
,这样就会打印出上三角形式的乘法表。 - 当
i
为1时,内部循环从1到9,打印第一行的全部结果;当i
为2时,内部循环从2到9,打印第二行的结果,以此类推。
运行这个脚本:
# 运行九九乘法表脚本
awk -f multiplication_table.awk
# 输出如下:
1x1=1 1x2=2 1x3=3 1x4=4 1x5=5 1x6=6 1x7=7 1x8=8 1x9=9
2x2=4 2x3=6 2x4=8 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18
3x3=9 3x4=12 3x5=15 3x6=18 3x7=21 3x8=24 3x9=27
4x4=16 4x5=20 4x6=24 4x7=28 4x8=32 4x9=36
5x5=25 5x6=30 5x7=35 5x8=40 5x9=45
6x6=36 6x7=42 6x8=48 6x9=54
7x7=49 7x8=56 7x9=63
8x8=64 8x9=72
9x9=81
相信通过上面的讲解,大家对自定义函数会有一个较为清晰的认识了。
大家可以试试能不打印处下三角乘法表,不妨在评论区试试。
如果您觉得有些用处,熟练操作这些代码后,相信你会有一些收获。
欢迎在评论区留言,关注。谢谢您的阅读!
敬请关注!
往期学习笔记: