曲径通幽论坛

标题: 变量的使用 [打印本页]

作者: beyes    时间: 2012-2-24 13:15
标题: 变量的使用
在 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 标签表示绘制标准单元格,包含表格数据。
效果如下图所示:
[attach]239[/attach]




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2