awk 教程:通过 3 个实际示例了解 awk 变量
与任何其他编程语言一样,Awk 也有用户定义的变量和内置变量。
在本文中,让我们了解一下如何定义和使用awk 变量。
- awk 变量应该以字母开头,后面可以包含字母数字字符或下划线。
- 关键字不能用作 awk 变量
- awk 不像其他编程语言那样支持变量声明
- 在 BEGIN 部分初始化 awk 变量总是更好,它在开始时只执行一次。
- awk 中没有数据类型。将 awk 变量视为数字还是字符串取决于使用它的上下文。
现在让我们回顾几个简单的例子来学习如何使用用户定义的 awk 变量。
awk 示例 1:图书计费
在此示例中,输入文件 bookdetails.txt 包含带有字段的记录 - 项目编号、书籍名称、数量和每本书的价格。
$ cat bookdetails.txt
1 Linux-programming 2 450
2 Advanced-Linux 3 300
3 Computer-Networks 4 400
4 OOAD&UML 3 450
5 Java2 5 200
现在下面的 Awk 脚本,读取并处理上述 bookdetails.txt 文件,并生成报告,显示 - 每本书的销售率,以及所有已售图书的总金额。
到目前为止,我们已经看到 Awk 从命令行读取命令,但是 Awk 也可以使用 -f 选项从文件中读取命令。
Syntax:
$ awk -f script-filename inputfilename
现在我们的用于书籍计费计算的 Awk 脚本如下所示。
$ cat book-calculation.awk
BEGIN {
total=0;
}
{
itemno=$1;
book=$2;
bookamount=$3*$4;
total=total+bookamount;
print itemno," ", book,"\t","$"bookamount;
}
END {
print "Total Amount = $"total;
}
在上面的脚本中,
- awk BEGIN 部分初始化变量 total。itemno、total、book、bookamount 是用户定义的 awk 变量。
- 在 Awk Action部分,Quantity*bookprice 将存储在一个名为 bookamount 的变量中。每个账面金额将与总数相加。
- 最后在 Awk END部分,total 变量将具有总量。
现在执行 book-calculation.awk 脚本以生成显示每个图书率和总金额的报告,如下所示。
$ awk -f book-calculation.awk bookdetails.txt
1 Linux-programming $900
2 Advanced-Linux $900
3 Computer-Networks $1600
4 OOAD&UML $1350
5 Java2 $1000
Total Amount = $5750
awk 示例 2. 学生分数计算
在此示例中,创建一个输入文件“student-marks.txt”,其中包含以下内容——学生姓名、卷号、Test1 分数、Test2 分数和 Test3 分数。
$ cat student-marks.txt
Jones 2143 78 84 77
Gondrol 2321 56 58 45
RinRao 2122 38 37 65
Edwin 2537 78 67 45
Dayan 2415 30 47 20
现在,下面的 awk 脚本将计算并生成报告,以显示每个学生的平均分、Test1、Test2 和 Test3 分数的平均值。
$cat student.awk
BEGIN {
test1=0;
test2=0;
test3=0;
print "Name\tRollNo\t Average Score";
}
{
total=$3+$4+$5;
test1=test1+$3;
test2=test2+$4;
test3=test3+$5;
print $1"\t"$2"\t",total/3;
}
END{
print "Average of Test1="test1/NR;
print "Average of Test2="test2/NR;
print "Average of Test3="test3/NR;
}
在上面的 awk 脚本中,
- 在Awk BEGIN部分中,所有 awk 变量都被初始化为零。test1、test2、test3 和 total 是用户定义的 awk 变量。
- 在Awk ACTION部分中,$3、$4、$5 分别是 Test1、Test2 和 Test3 的分数。总变量是每个学生的 3 个考试成绩相加。awk 变量 test1、test2 和 test3 具有每个相应测试的总分。
- 因此,在Awk END部分中,将每个测试总数除以记录总数(即学生)将得出平均分数。 NR是一个Awk 内置变量,它给出输入中的记录总数。
awk 示例 3. 学生详细信息的 HTML 报告
在上面的两个例子中,我们看到了 awk 变量,它的值是数字。此示例显示了 awk 脚本,用于为学生姓名及其卷号生成 html 报告。
$ cat string.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;
rollno=$2;
print "<tr><td>"name"</td><td>"rollno"</td></tr>";
}
END {
print "</table></body>\n</html>";
}
使用我们在上面示例中创建的相同 student-marks.txt 输入文件。
$ awk -f string.awk student-marks.txt
<html>
<title>AWK</title><body bgcolor="#ffffff">
<table border=1><th colspan=2 align=centre>Student Details</th>
<tr><td>Jones</td><td>2143</td></tr>
<tr><td>Gondrol</td><td>2321</td></tr>
<tr><td>RinRao</td><td>2122</td></tr>
<tr><td>Edwin</td><td>2537</td></tr>
<tr><td>Dayan</td><td>2415</td></tr>
</table></body>
</html>
我们可以存储上面的输出,它给出了下面的 html 表。在上面的脚本中,名为 name 和 rollno 的变量是字符串变量,因为它是在字符串上下文中使用的。
Student Details | |
---|---|
Jones | 2143 |
Gondrol | 2321 |
RinRao | 2122 |
Edwin | 2537 |
Dayan | 2415 |
- 点赞
- 收藏
- 关注作者
评论(0)