AWK-文本处理测试实例记录
我们可以将复杂的 awk 语句写入脚本文件 cal.awk
,然后通过 -f
选项指定从脚本文件执行。
- 在
BEGIN
阶段,我们初始化了相关变量,并打印了表头的格式 - 在
body
阶段,我们读取每一行数据,计算该学科和该同学的总成绩 - 在
END
阶段,我们先打印了表尾的格式,并打印总成绩,以及计算了平均值
#############################################################
[root@localhost ~]# cat cal.awk
#!/bin/awk -f
BEGIN {
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "-----------------------------------------------------\n"
}
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1,$2,$3,$4,$5,$3+$4+$5
}
END {
printf "---------------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math,english,computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n",math/NR,english/NR,computer/NR
}
###########################################################
[root@localhost ~]# cat score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
#############################################################
[root@localhost ~]# awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
-----------------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------------
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00
########################################################
if 语句
复杂的条件判断,可以使用 awk 的 if
语句,awk 的强大正因为它是个脚本解释器,拥有一般脚本语言的编程能力,下边示例通过稍微复杂的条件进行拆分文件
#######################################################
通过上述的示例,我们学习到了 awk 的工作原理,下边我们来总结下几个概念和常用的知识点。
内置变量
1. 每一行内容记录,叫做记录,英文名称 Record
2. 每行中通过分隔符隔开的每一列,叫做字段,英文名称 Field
明确这几个概念后,我们来总结几个重要的内置变量:
NR
:表示当前的行数;NF
:表示当前的列数;RS
:行分隔符,默认是换行;FS
:列分隔符,默认是空格和制表符;OFS
:输出列分隔符,用于打印时分割字段,默认为空格ORS
:输出行分隔符,用于打印时分割记录,默认为换行符
awk 提供 printf
函数进行格式化输出功能,具体的使用方式和 C
语法基本一致。
基本用法
printf " TOTAL:%10d %8d %8d \n", math,english,computer
常用的格式化方式:
%d
十进制有符号整数%u
十进制无符号整数%f
浮点数%s
字符串%c
单个字符%e
指数形式的浮点数%x
%X
无符号以十六进制表示的整数%0
无符号以八进制表示的整数%g
自动选择合适的表示法\n
换行符\t
Tab符
常用函数
awk 内置了大量的有用函数功能,也支持自定义函数,允许你编写自己的函数来扩展内置函数。
这里只简单罗列一些比较常用的字符串函数:
index(s, t)
返回子串 t 在 s 中的位置length(s)
返回字符串 s 的长度split(s, a, sep)
分割字符串,并将分割后的各字段存放在数组 a 中substr(s, p, n)
根据参数,返回子串tolower(s)
将字符串转换为小写toupper(s)
将字符串转换为大写