2
0
mirror of https://github.com/LCTT/TranslateProject.git synced 2025-01-25 23:11:02 +08:00

Merge pull request from wxy/20191031-Advance-your-awk-skills-with-two-easy-tutorials

PRF&PUB:20191031 Advance your awk skills with two easy tutorials
This commit is contained in:
Xingyu.Wang 2020-09-28 15:53:03 +08:00 committed by GitHub
commit c745e97d31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,20 +1,20 @@
[#]: collector: (lujun9972) [#]: collector: (lujun9972)
[#]: translator: (wxy) [#]: translator: (wxy)
[#]: reviewer: ( ) [#]: reviewer: (wxy)
[#]: publisher: ( ) [#]: publisher: (wxy)
[#]: url: ( ) [#]: url: (https://linux.cn/article-12658-1.html)
[#]: subject: (Advance your awk skills with two easy tutorials) [#]: subject: (Advance your awk skills with two easy tutorials)
[#]: via: (https://opensource.com/article/19/10/advanced-awk) [#]: via: (https://opensource.com/article/19/10/advanced-awk)
[#]: author: (Dave Neary https://opensource.com/users/dneary) [#]: author: (Dave Neary https://opensource.com/users/dneary)
通过两个简单的教程来提高你的 awk 技能 通过两个简单的教程来提高你的 awk 技能
====== ======
> 超越单行的awk脚本邮件合并和字数统计。 > 超越单行的 awk 脚本,学习如何做邮件合并和字数统计。
!["一个团队的检查表"[1]
`awk` 是 Unix 和 Linux 用户工具箱中最古老的工具之一。`awk` 由 Alfred Aho、Peter Weinberger 和 Brian Kernighan工具名称中的 A、W 和 K在 20 世纪 70 年代创建,用于复杂的文本流处理。它是流编辑器 `sed` 的配套工具,后者是为逐行处理文本文件而设计的。`awk` 支持更复杂的结构化程序,是一种完整的编程语言。 ![](https://img.linux.net.cn/data/attachment/album/202009/28/154624jk8w4ez6oujbur8j.jpg)
`awk` 是 Unix 和 Linux 用户工具箱中最古老的工具之一。`awk` 由 Alfred Aho、Peter Weinberger 和 Brian Kernighan即工具名称中的 A、W 和 K在 20 世纪 70 年代创建,用于复杂的文本流处理。它是流编辑器 `sed` 的配套工具,后者是为逐行处理文本文件而设计的。`awk` 支持更复杂的结构化程序,是一门完整的编程语言。
本文将介绍如何使用 `awk` 完成更多结构化的复杂任务,包括一个简单的邮件合并程序。 本文将介绍如何使用 `awk` 完成更多结构化的复杂任务,包括一个简单的邮件合并程序。
@ -34,7 +34,7 @@
function 函数名(参数列表) { 语句 } function 函数名(参数列表) { 语句 }
``` ```
这种模式匹配块和函数的组合允许开发者结构化 `awk` 程序,以便重用和可读。 这种模式匹配块和函数的组合允许开发者结构化 `awk` 程序,以便重用和提高可读
### awk 如何处理文本流 ### awk 如何处理文本流
@ -42,12 +42,12 @@ function 函数名(参数列表) { 语句 }
* `FS`<ruby>字段分隔符<rt>field separator</rt></ruby>)。默认情况下,这是任何空格字符(空格或制表符)。 * `FS`<ruby>字段分隔符<rt>field separator</rt></ruby>)。默认情况下,这是任何空格字符(空格或制表符)。
* `RS`<ruby>记录分隔符<rt>record separator</rt></ruby>)。默认情况下是一个新行(`n`)。 * `RS`<ruby>记录分隔符<rt>record separator</rt></ruby>)。默认情况下是一个新行(`n`)。
* `NF`<ruby>字段数<rt>number of fields</rt></ruby>)。当 `awk` 解析一行时,这个变量被设置为已解析的字段数。 * `NF`<ruby>字段数<rt>number of fields</rt></ruby>)。当 `awk` 解析一行时,这个变量被设置为被解析出字段数。
* `$0:` 当前记录。 * `$0:` 当前记录。
* `$1`、`$2`、`$3` 等:当前记录的第一、第二、第三等字段。 * `$1`、`$2`、`$3` 等:当前记录的第一、第二、第三等字段。
* `NR`<ruby>记录数<rt>number of records</rt></ruby>)。迄今已被 `awk` 脚本解析的记录数。 * `NR`<ruby>记录数<rt>number of records</rt></ruby>)。迄今已被 `awk` 脚本解析的记录数。
影响 `awk` 行为的变量还有很多,但这已经足够开始了。 影响 `awk` 行为的变量还有很多,但知道已经足够开始了。
### 单行 awk 脚本 ### 单行 awk 脚本
@ -105,7 +105,7 @@ Mickey,Mouse,mmouse@disney.com,"Surviving public speaking with a squeaky voice"
Santa,Claus,sclaus@northpole.org,"Efficient list-making" Santa,Claus,sclaus@northpole.org,"Efficient list-making"
``` ```
你要读取 CSV 文件,替换第一个文件中的相关字段(跳过第一行),然后把结果写到一个叫 `acceptanceN.txt` 的文件中,每解析一行就递增 `N` 你要读取 CSV 文件,替换第一个文件中的相关字段(跳过第一行),然后把结果写到一个叫 `acceptanceN.txt` 的文件中,每解析一行就递增文件名中的 `N`
`awk` 程序写在一个叫 `mail_merge.awk` 的文件中。在 `awk` 脚本中的语句用 `;` 分隔。第一个任务是设置字段分隔符变量和其他几个脚本需要的变量。你还需要读取并丢弃 CSV 中的第一行,否则会创建一个以 `Dear firstname` 开头的文件。要做到这一点,请使用特殊函数 `getline`,并在读取后将记录计数器重置为 0。 `awk` 程序写在一个叫 `mail_merge.awk` 的文件中。在 `awk` 脚本中的语句用 `;` 分隔。第一个任务是设置字段分隔符变量和其他几个脚本需要的变量。你还需要读取并丢弃 CSV 中的第一行,否则会创建一个以 `Dear firstname` 开头的文件。要做到这一点,请使用特殊函数 `getline`,并在读取后将记录计数器重置为 0。
@ -125,17 +125,17 @@ BEGIN {
``` ```
{ {
        # Read relevant fields from input file         # 从输入文件中读取关联字段
        firstname=$1;         firstname=$1;
        lastname=$2;         lastname=$2;
        email=$3;         email=$3;
        title=$4;         title=$4;
        # Set output filename         # 设置输出文件名
        outfile=(output NR ".txt");         outfile=(output NR ".txt");
        # Read a line from template, replace special fields, and         # 从模板中读取一行,替换特定字段,
        # print result to output file         # 并打印结果到输出文件。
        while ( (getline ln &lt; template) &gt; 0 )         while ( (getline ln &lt; template) &gt; 0 )
        {         {
                sub(/{firstname}/,firstname,ln);                 sub(/{firstname}/,firstname,ln);
@ -145,7 +145,7 @@ BEGIN {
                print(ln) &gt; outfile;                 print(ln) &gt; outfile;
        }         }
        # Close template and output file in advance of next record         # 关闭模板和输出文件,继续下一条记录
        close(outfile);         close(outfile);
        close(template);         close(template);
} }
@ -153,7 +153,6 @@ BEGIN {
你已经完成了! 在命令行上运行该脚本: 你已经完成了! 在命令行上运行该脚本:
``` ```
awk -f mail_merge.awk proposals.csv awk -f mail_merge.awk proposals.csv
``` ```
@ -164,7 +163,7 @@ awk -f mail_merge.awk proposals.csv
awk -f mail_merge.awk < proposals.csv awk -f mail_merge.awk < proposals.csv
``` ```
你会发现在当前目录下生成的文本文件。 你会在当前目录下发现生成的文本文件。
### awk 进阶:字频计数 ### awk 进阶:字频计数
@ -254,7 +253,7 @@ via: https://opensource.com/article/19/10/advanced-awk
作者:[Dave Neary][a] 作者:[Dave Neary][a]
选题:[lujun9972][b] 选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy) 译者:[wxy](https://github.com/wxy)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出