赞
踩
Linux操作系统的操作和文本处理的用法,我们在前几期的笔记中多多少少都涉及了一些,有需要的朋友们,欢迎到我主页查看Linux详细的笔记。
现在我们开始分享Linux能够作为一门编程语言的高级用法,用户自定义函数。关于函数作用,函数不仅提高了代码的复用度也提高代码的鲁棒性。
先看语法:
- 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
下面的示例代码都是在这个逻辑上写的。
假设我们有一个文件`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
还是上面的文件`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
还是上面的文件`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
当然,学习代码,最经典的当时要打印九九乘法表了,下面我们来试试。创建一个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
相信通过上面的讲解,大家对自定义函数会有一个较为清晰的认识了。
大家可以试试能不打印处下三角乘法表,不妨在评论区试试。
如果您觉得有些用处,熟练操作这些代码后,相信你会有一些收获。
欢迎在评论区留言,关注。谢谢您的阅读!
敬请关注!
往期学习笔记:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。