怎么使用awk的特殊模式BEGIN和END

发布时间:2021-10-26 17:25:09 作者:小新
来源:亿速云 阅读:749
# 怎么使用awk的特殊模式BEGIN和END

## 引言

在文本处理和数据分析领域,`awk`是一个功能强大的工具,它以其简洁的语法和高效的文本处理能力而闻名。`awk`的灵活性和强大功能很大程度上来自于其特殊的模式和处理机制,其中`BEGIN`和`END`模式是两个非常重要的特殊模式。本文将深入探讨`BEGIN`和`END`模式的使用方法、应用场景以及实际示例,帮助读者更好地理解和运用这两个模式。

## 什么是BEGIN和END模式

`BEGIN`和`END`是`awk`中的两个特殊模式,它们分别在`awk`程序开始执行前和结束后触发。具体来说:

- **BEGIN模式**:在`awk`读取任何输入行之前执行,通常用于初始化变量、打印表头或设置字段分隔符等准备工作。
- **END模式**:在`awk`处理完所有输入行之后执行,通常用于汇总计算结果、打印统计信息或清理资源等收尾工作。

这两个模式都不依赖于输入数据,因此即使没有输入文件,`BEGIN`和`END`块中的代码也会执行。

## BEGIN模式的使用

### 基本语法

`BEGIN`模式的基本语法如下:

```awk
BEGIN { 
    # 初始化操作
    print "程序开始执行..."
}

常见用途

  1. 初始化变量
    BEGIN块中可以初始化变量,确保在程序处理数据之前变量已经具有合适的初始值。
   BEGIN {
       sum = 0
       count = 0
   }
  1. 设置字段分隔符
    通过FS(输入字段分隔符)或OFS(输出字段分隔符)可以自定义字段的分割方式。
   BEGIN {
       FS = ","
       OFS = "\t"
   }
  1. 打印表头
    在输出数据之前,可以先打印表头信息。
   BEGIN {
       print "Name\tAge\tScore"
       print "------------------"
   }

实际示例

假设有一个名为students.csv的文件,内容如下:

Alice,25,90
Bob,22,85
Carol,23,95

以下awk脚本使用BEGIN模式打印表头并设置字段分隔符:

BEGIN {
    FS = ","
    print "Name\tAge\tScore"
    print "------------------"
}
{
    print $1, $2, $3
}

运行命令:

awk -f script.awk students.csv

输出结果:

Name    Age     Score
------------------
Alice   25      90
Bob     22      85
Carol   23      95

END模式的使用

基本语法

END模式的基本语法如下:

END { 
    # 收尾操作
    print "程序执行完毕。"
}

常见用途

  1. 汇总计算结果
    在处理完所有数据后,可以计算总和、平均值等统计信息。
   END {
       avg = sum / count
       print "总分:", sum
       print "平均分:", avg
   }
  1. 打印统计信息
    可以输出处理的行数、匹配的行数等。
   END {
       print "总行数:", NR
   }
  1. 清理资源
    如果需要,可以在END块中关闭文件或释放资源。

实际示例

继续使用students.csv文件,以下脚本计算学生的平均年龄和平均分数:

BEGIN {
    FS = ","
    sum_age = 0
    sum_score = 0
}
{
    sum_age += $2
    sum_score += $3
}
END {
    avg_age = sum_age / NR
    avg_score = sum_score / NR
    print "平均年龄:", avg_age
    print "平均分数:", avg_score
}

运行命令:

awk -f script.awk students.csv

输出结果:

平均年龄: 23.3333
平均分数: 90

BEGIN和END模式的结合使用

BEGINEND模式可以同时出现在一个awk脚本中,分别用于初始化和收尾工作。以下是一个完整的示例,统计students.csv中的学生信息:

BEGIN {
    FS = ","
    print "学生信息统计"
    print "============"
    sum_age = 0
    sum_score = 0
}
{
    sum_age += $2
    sum_score += $3
    print $1, $2, $3
}
END {
    print "============"
    print "总人数:", NR
    print "平均年龄:", sum_age / NR
    print "平均分数:", sum_score / NR
}

运行命令:

awk -f script.awk students.csv

输出结果:

学生信息统计
============
Alice 25 90
Bob 22 85
Carol 23 95
============
总人数: 3
平均年龄: 23.3333
平均分数: 90

高级用法

多文件处理

当处理多个文件时,BEGINEND模式的行为如下:

如果需要为每个文件单独执行某些操作,可以使用FNR(当前文件的记录数)和NR(总记录数)的区别来判断文件是否切换。

动态设置变量

BEGIN块中可以动态设置变量,例如根据环境变量或命令行参数初始化:

BEGIN {
    threshold = ENVIRON["THRESHOLD"] ? ENVIRON["THRESHOLD"] : 80
    print "阈值设置为:", threshold
}

结合正则表达式

BEGINEND模式可以与正则表达式结合使用,例如在BEGIN中预编译正则表达式:

BEGIN {
    pattern = "^A"
}
$1 ~ pattern {
    print $0
}

常见问题与注意事项

  1. BEGIN和END的执行顺序
    BEGIN块总是最先执行,END块总是最后执行,即使它们在脚本中的位置不是开头或结尾。

  2. 无输入文件时的行为
    即使没有输入文件,BEGINEND块也会执行。

  3. 多个BEGIN或END块
    可以定义多个BEGINEND块,它们会按照出现的顺序依次执行。

  4. 变量作用域
    BEGINEND块中定义的变量在整个awk脚本中有效。

总结

BEGINEND模式是awk中非常强大的特性,它们为文本处理提供了灵活的初始化和收尾机制。通过合理使用这两个模式,可以显著提高脚本的可读性和功能性。无论是简单的数据统计还是复杂的文本处理,BEGINEND都能发挥重要作用。希望本文能够帮助你更好地理解和运用这两个模式,提升awk脚本的编写效率。

参考资料

  1. The GNU Awk User’s Guide
  2. AWK - A Tutorial and Introduction
  3. Effective AWK Programming

”`

推荐阅读:
  1. AWK——的使用
  2. 关于Unbalanced calls to begin/end appearance transitions for <>警告

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

awk

上一篇:Python的10个神奇的技巧分别是哪些

下一篇:神经网络理论基础及Python实现是怎么样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》