From 23dfd71e9b5a87f170b08608875b986dc6065c35 Mon Sep 17 00:00:00 2001 From: Xingyu Wang Date: Mon, 2 Dec 2019 23:33:41 +0800 Subject: [PATCH 1/2] PRF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @lxbwolf 恭喜你完成了第一篇贡献! --- .../tech/20191125 How to use loops in awk.md | 80 ++++++++----------- 1 file changed, 35 insertions(+), 45 deletions(-) diff --git a/translated/tech/20191125 How to use loops in awk.md b/translated/tech/20191125 How to use loops in awk.md index a200611ba2..c9fb42dd36 100644 --- a/translated/tech/20191125 How to use loops in awk.md +++ b/translated/tech/20191125 How to use loops in awk.md @@ -1,6 +1,6 @@ [#]: collector: "lujun9972" [#]: translator: "lxbwolf" -[#]: reviewer: " " +[#]: reviewer: "wxy" [#]: publisher: " " [#]: url: " " [#]: subject: "How to use loops in awk" @@ -9,50 +9,50 @@ 在 awk 中怎么使用循环 ====== -来学习一下多次执行同一条命令的不同类型的循环。 -![arrows cycle symbol for failing faster][1] -awk 脚本有三个主要部分:BEGIN 和 END 函数(都可选),用户自己写的每次要执行的函数。某种程度上,awk 的主体部分就是一个循环,因为函数中的命令对每一条记录都会执行一次。然而,有时你希望对于一条记录执行多次命令,那么你就需要用到循环。 +> 来学习一下多次执行同一条命令的不同类型的循环。 + +![](https://img.linux.net.cn/data/attachment/album/201912/02/232951h3ibohlh77bk77d7.jpg) + +`awk` 脚本有三个主要部分:`BEGIN` 和 `END` 函数(都可选),用户自己写的每次要执行的函数。某种程度上,`awk` 的主体部分就是一个循环,因为函数中的命令对每一条记录都会执行一次。然而,有时你希望对于一条记录执行多次命令,那么你就需要用到循环。 有多种类型的循环,分别适合不同的场景。 ### while 循环 -一个 while 循环检测一个表达式,如果表达式为 *true* 就执行命令。当表达式变为 *false* 时,循环中断。 - +一个 `while` 循环检测一个表达式,如果表达式为 `true` 就执行命令。当表达式变为 `false` 时,循环中断。 ``` #!/bin/awk -f BEGIN { -        # Print the squares from 1 to 10 + # Loop through 1 to 10 -    i=1; -    while (i <= 10) { -        print "The square of ", i, " is ", i*i; -        i = i+1; -    } + 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),循环终止。 +在这个简单实例中,`awk` 打印了放在变量 `i` 中的整数值的平方。`while (i <= 10)` 语句告诉 `awk` 仅在 `i` 的值小于或等于 10 时才执行循环。在循环最后一次执行时(`i` 的值是 10),循环终止。 -### Do while 循环 - -do-while 循环在关键字 **do** 之后执行命令。在每次循环结束时检测一个表达式来决定是否终止循环。仅在表达式返回 true 时才会重复执行命令(即还没有到终止循环的条件)。如果表达式返回 false,因为到了终止循环的条件所以循环被终止。 +### do-while 循环 +do-while 循环执行在关键字 `do` 之后的命令。在每次循环结束时检测一个测试表达式来决定是否终止循环。仅在测试表达式返回 `true` 时才会重复执行命令(即还没有到终止循环的条件)。如果测试表达式返回 `false`,因为到了终止循环的条件所以循环被终止。 ``` #!/usr/bin/awk -f BEGIN { -        i=2; -        do { -                print "The square of ", i, " is ", i*i; -                i = i + 1 -        } -        while (i < 10) + i=2; + do { + print i, " to the second power is ", i*i; + i = i + 1 + } + while (i < 10) exit; } @@ -60,28 +60,26 @@ exit; ### for 循环 -awk 中有两种 **for**循环。 - -一种 **for** 循环初始化一个变量,检测一个表达式,执行变量递增,当表达式的结果为 true 时循环就会一直执行。 +`awk` 中有两种 `for` 循环。 +一种 `for` 循环初始化一个变量,检测一个测试表达式,执行变量递增,当表达式的结果为 `true` 时循环就会一直执行。 ``` #!/bin/awk -f BEGIN { -    for (i=1; i <= 10; i++) { -        print "The square of ", i, " is ", i*i; -    } + for (i=1; i <= 10; i++) { + print i, " to the second power is ", i*i; + } exit; } ``` -另一种 **for** 循环设置一个有连续 index 的数组变量,对每一个索引执行一个命令集。换句话说,它用一个数组「收集」每一条命令执行后的结果。 +另一种 `for` 循环设置一个有连续索引的数组变量,对每一个索引执行一个命令集。换句话说,它用一个数组“收集”每一条命令执行后的结果。 -本例实现了一个简易版的 Unix 命令 **uniq** 。通过把一系列字符串作为 key 加到数组 a 中,当相同的 key 再次出现时就增加 value 的值,可以得到某个字符串出现的次数(就像 **uniq** 的 **--count** 选项)。如果你打印该数组的所有 key,将会得到出现过的所有字符串。 - -用 demo 文件 **colours.txt** (前一篇文章中的文件)来举例: +本例实现了一个简易版的 Unix 命令 `uniq`。通过把一系列字符串作为键加到数组 `a` 中,当相同的键再次出现时就增加键值,可以得到某个字符串出现的次数(就像 `uniq` 的 `--count` 选项)。如果你打印该数组的所有键,将会得到出现过的所有字符串。 +用演示文件 `colours.txt`(前一篇文章中的文件)来举例: ``` name       color  amount @@ -97,10 +95,7 @@ potato     brown  9 pineapple  yellow 5 ``` - - -这是 awk 版的简易 **uniq -c**: - +这是 `awk` 版的简易 `uniq -c`: ``` #! /usr/bin/awk -f @@ -115,8 +110,7 @@ END { } ``` -示例数据文件的第三列是第一列列出的条目的计数。你可以用一个数组和 **for** 循环来从 color 维度统计第三列的条目。 - +示例数据文件的第三列是第一列列出的条目的计数。你可以用一个数组和 `for` 循环来按颜色统计第三列的条目。 ``` #! /usr/bin/awk -f @@ -136,15 +130,11 @@ END { } ``` -你可以看到,在处理文件之前也需要在 **前置** 函数(仅仅执行一次)中打印一列表头。 +你可以看到,在处理文件之前也需要在 `BEFORE` 函数(仅仅执行一次)中打印一列表头。 ### 循环 -在任何编程语言中循环都是很重要的一部分,awk 也不例外。使用循环你可以控制 awk 脚本怎样去运行,它可以统计什么信息,还有它怎么去处理你的数据。我们下一篇文章会讨论 switch 语句,**continue** 和 **next**。 - -* * * - -你是否更想听这篇文章?本文已被收录进 [Hacker Public Radio](http://hackerpublicradio.org/eps.php?id=2330),一个来自黑客,面向黑客的社区技术博客。 +在任何编程语言中循环都是很重要的一部分,`awk` 也不例外。使用循环你可以控制 `awk` 脚本怎样去运行,它可以统计什么信息,还有它怎么去处理你的数据。我们下一篇文章会讨论 `switch`、`continue` 和 `next` 语句。 -------------------------------------------------------------------------------- @@ -153,7 +143,7 @@ via: https://opensource.com/article/19/11/loops-awk 作者:[Seth Kenlon][a] 选题:[lujun9972][b] 译者:[lxbwolf](https://github.com/lxbwolf) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 1342f9267221cd137f6b5d4bb1c6b8325fe984d2 Mon Sep 17 00:00:00 2001 From: Xingyu Wang Date: Mon, 2 Dec 2019 23:36:39 +0800 Subject: [PATCH 2/2] PUB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @lxbwolf 本文首发地址: https://linux.cn/article-11636-1.html 您的 LCTT 专页: https://linux.cn/lctt/lxbwolf 请注册领取 LCCN: https://lctt.linux.cn/ --- .../tech => published}/20191125 How to use loops in awk.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename {translated/tech => published}/20191125 How to use loops in awk.md (98%) diff --git a/translated/tech/20191125 How to use loops in awk.md b/published/20191125 How to use loops in awk.md similarity index 98% rename from translated/tech/20191125 How to use loops in awk.md rename to published/20191125 How to use loops in awk.md index c9fb42dd36..35c2b33d7a 100644 --- a/translated/tech/20191125 How to use loops in awk.md +++ b/published/20191125 How to use loops in awk.md @@ -1,8 +1,8 @@ [#]: collector: "lujun9972" [#]: translator: "lxbwolf" [#]: reviewer: "wxy" -[#]: publisher: " " -[#]: url: " " +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-11636-1.html" [#]: subject: "How to use loops in awk" [#]: via: "https://opensource.com/article/19/11/loops-awk" [#]: author: "Seth Kenlon https://opensource.com/users/seth"