在 awk 中怎么使用循环

来学习一下屡次执行同一条命令的不一样类型的循环。linux

awk 脚本有三个主要部分:BEGINEND 函数(均可选),用户本身写的每次要执行的函数。某种程度上,awk 的主体部分就是一个循环,由于函数中的命令对每一条记录都会执行一次。然而,有时你但愿对于一条记录执行屡次命令,那么你就须要用到循环。git

有多种类型的循环,分别适合不一样的场景。github

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 时才会重复执行命令(即尚未到终止循环的条件)。若是测试表达式返回 false,由于到了终止循环的条件因此循环被终止。bash

#!/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 循环。app

一种 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 选项)。若是你打印该数组的全部键,将会获得出现过的全部字符串。oop

用演示文件 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 脚本怎样去运行,它能够统计什么信息,还有它怎么去处理你的数据。咱们下一篇文章会讨论 switchcontinuenext 语句。


via: opensource.com/article/19/…

做者:Seth Kenlon 选题:lujun9972 译者:lxbwolf 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索