awk 教程:通过 3 个实际示例了解 awk 变量

举报
Tiamo_T 发表于 2022/01/23 08:11:57 2022/01/23
【摘要】 与任何其他编程语言一样,Awk 也有用户定义的变量和内置变量。 在本文中,让我们了解一下如何定义和使用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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。