如何在 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) (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.