在 awk 里可以使用变量,这使得 awk 变得更加强大与灵活。在 awk 里使用变量有以下几点特征:
1. awk 的变量以字母开头,后面可跟着字母,数字以及下划线。
2. 内置变量 及关键字不能用作普通变量。
3. awk 不支持对变量声明,比如像在 C 语言中声明整型变量需要用 int 关键字一样。
4. 在 awk 中通常都在BEGIN 区域里进行变量的初始化。
5. awk 里没有数据类型,即没有明确定义 int ,double, char 这样的类型。变量的类型根据上下文的情况来确定。
下面的测试文本是一个公司的成员组成,给出了每种技术工种的人数以及它们的月薪:$ cat employee.txt
1 director 2 30000
2 manager 4 20000
3 engineer 8 9000
4 technician 20 4500 下面的脚本统计每一个工种的总月薪支出以及所有员工的月薪支出情况:
[Bash shell] 纯文本查看 复制代码 $ cat total.awk
BEGIN {
total = 0;
}
{
Emno = $1;
Type = $2;
SalaryAmount = $3 * $4;
total = total + SalaryAmount;
print Emno, " ", Type "\t", SalaryAmount"RMB";
}
END {
print "Total Salary = " total"RMB";
}
运行输出:$ awk -f total.awk employee.txt
1 director 60000RMB
2 manager 80000RMB
3 engineer 72000RMB
4 technician 90000RMB
Total Salary = 302000RMB
下面文本的每一行依次给出了学生的姓名,学号,以及 语文,数学,英语 3 门功课的分数:$ cat score.txt
beyes 10000 90 78 98
admin 10001 99 64 72
tony 10002 45 32 56
tom 10003 12 34 87
lilei 10004 48 25 70 接下来下面的脚本将统计每个学生的平均分以及所有学生的每个科目的平均分,脚本如下:
[Bash shell] 纯文本查看 复制代码 $ cat score.awk
BEGIN {
chinese = 0;
math = 0;
english = 0;
print "Name\tID\t Average Score";
}
{
total = $3 + $3 + $5;
chinese = chinese + $3;
math = math + $4;
english = english + $5;
print $1"\t"$2"\t", total/3;
}
END {
print "Average of chinese = " chinese/NR;
print "Average of math = " math/NR;
print "Average of english = " english/NR;
}
运行输出:$ awk -f score.awk score.txt
Name ID Average Score
beyes 10000 92.6667
admin 10001 90
tony 10002 48.6667
tom 10003 37
lilei 10004 55.3333
Average of chinese = 58.8
Average of math = 46.6
Average of english = 76.6 程序中,NR 是内置变量,表示行号,即等于学生的人数。
将上面的学生信息以 HTML 的形式输出,这里也可以通过 awk 来实现:
[Bash shell] 纯文本查看 复制代码 cat student_htm.awk
BEGIN {
title = "AWK";
print "<html>\n<title>"title"</title><body bgcolor=\"#ffffff\">\n<table border=1><th colspan=2 align=centre>Student Details</th>";
}
{
Name = $1;
ID = $2;
print "<tr><td>"Name"</td><td>"ID"</td></tr>";
}
END {
print "</table></body>\n</html>";
}
上面代码中,html 的 th 标签表示绘制的表格包含表头信息,其属性 colspan 表示单元格横跨的列数。td 标签表示绘制标准单元格,包含表格数据。
效果如下图所示:
|