Awk 脚本有三个主要部分:可选的 BEGIN 和 END 函数以及您编写的在每个记录上执行的函数。在某种程度上,awk 脚本的主体是一个循环,因为函数中的命令为每个记录运行。但是,有时您希望在一个记录上多次运行命令,为此,您必须编写一个循环。
有几种类型的循环,每种循环都有其独特的用途。
While 循环
while 循环测试一个条件,并在测试返回 true 时执行命令。一旦测试返回 false,循环就会被中断。
#!/bin/awk -f
BEGIN {
# Loop through 1 to 10
i=1;
while (i <= 10) {
print i, " to the second power is ", i*i;
i = i+1;
}
exit;
}
在这个简单的例子中,awk 打印变量 i 中包含的整数的平方。while (i <= 10) 短语告诉 awk 仅当 i 的值小于或等于 10 时才执行循环。在最后一次迭代(当 i 为 10 时)之后,循环结束。
Do while 循环
do while 循环在关键字 do 之后执行命令。它之后执行一个测试,以确定是否已满足停止条件。只有在测试返回 true 时(即,未 满足结束条件),才会重复执行命令。如果测试失败,则循环被中断,因为已满足结束条件。
#!/usr/bin/awk -f
BEGIN {
i=2;
do {
print i, " to the second power is ", i*i;
i = i + 1
}
while (i < 10)
exit;
}
For 循环
awk 中有两种类型的 for 循环。
一种 for 循环初始化一个变量,执行一个测试,并将变量一起递增,在测试为 true 时执行命令。
#!/bin/awk -f
BEGIN {
for (i=1; i <= 10; i++) {
print i, " to the second power is ", i*i;
}
exit;
}
另一种 for 循环将变量设置为数组的连续索引,为每个索引执行一组命令。换句话说,它使用数组从记录中“收集”数据。
此示例实现了 Unix 命令 uniq 的简化版本。通过将字符串列表作为键添加到名为 a 的数组中,并在每次出现相同的键时递增值,您可以获得字符串出现的次数计数(如 uniq 的 --count 选项)。如果您打印数组的键,您将获得每个出现一次或多次的字符串。
例如,使用演示文件 colours.txt(来自之前的文章)
name color amount
apple red 4
banana yellow 6
raspberry red 99
strawberry red 3
grape purple 10
apple green 8
plum purple 2
kiwi brown 4
potato brown 9
pineapple yellow 5
这是 awk 形式的 uniq -c 的简单版本
#! /usr/bin/awk -f
NR != 1 {
a[$2]++
}
END {
for (key in a) {
print a[key] " " key
}
}
示例数据文件的第三列包含第一列中列出的项目数。您可以使用数组和 for 循环按颜色统计第三列中的项目
#! /usr/bin/awk -f
BEGIN {
FS=" ";
OFS="\t";
print("color\tsum");
}
NR != 1 {
a[$2]+=$3;
}
END {
for (b in a) {
print b, a[b]
}
}
如您所见,您还在处理文件之前在 BEFORE 函数(始终只发生一次)中打印标题列。
循环
循环是任何编程语言的重要组成部分,awk 也不例外。使用循环可以帮助您控制 awk 脚本的运行方式、它能够收集的信息以及它处理数据的方式。我们的下一篇文章将介绍 switch 语句、continue 和 next。
您更喜欢听这篇文章吗?它改编自 Hacker Public Radio 的一集,这是一个由黑客为黑客制作的社区技术播客。
2 条评论