如何在 awk 中使用循环

了解如何使用不同类型的循环在记录上多次运行命令。
180 位读者喜欢这篇文章。
arrows cycle symbol for failing faster

Opensource.com

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 语句、continuenext


您更喜欢听这篇文章吗?它改编自 Hacker Public Radio 的一集,这是一个由黑客为黑客制作的社区技术播客。

接下来阅读
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算行业工作,通常同时进行。
User profile image.
Dave Morriss 是一位居住在苏格兰爱丁堡的退休 IT 经理。他曾在英国高等教育部门工作,为学生和教职员工提供 IT 服务。

2 条评论

找到错别字 :)
print "The square of ", i, " is ", i*i;
i = i+1;

最后一刻简化示例的风险....

感谢指出。现在回去做我的数学作业...

回复 作者 Sento (sh) (未验证)

© . All rights reserved.