awk中循环遍历
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)之后,循环结束。
做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 ;
}
对于循环
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 \t sum"
) ;
}
NR
! =
1
{
a
[
$2
] +=
$3 ;
}
END
{
for
( b
in a
)
{
print b, a
[ b
]
}
}
如您所见,在处理文件之前,您还需要在BEFORE函数中打印标题列(该列始终仅发生一次)。
循环
循环是任何编程语言的重要组成部分,awk也不例外。 使用循环可以帮助您控制awk脚本的运行方式,可以收集哪些信息以及如何处理数据。 我们的下一篇文章将介绍switch语句, continue和next 。
您愿意听这篇文章吗? 它改编自黑客社区广播公司Hacker Public Radio的一集,内容是针对黑客的。
awk中循环遍历