如何使用 AWK 根据条件过滤数据

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程全面介绍了 AWK 编程语言,它是 Linux/Unix 环境中用于数据处理和分析的强大工具。你将学习 AWK 的基础知识,包括如何利用其内置函数和控制结构,从各种来源(如 CSV 文件、日志文件和其他基于文本的数据源)中提取、转换和分析结构化数据。通过本教程的学习,你将深入理解如何使用 AWK 简化与数据相关的任务并提高工作效率。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/InputandOutputRedirectionGroup(["Input and Output Redirection"]) linux/BasicFileOperationsGroup -.-> linux/cut("Text Cutting") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/TextProcessingGroup -.-> linux/sed("Stream Editing") linux/TextProcessingGroup -.-> linux/awk("Text Processing") linux/TextProcessingGroup -.-> linux/sort("Text Sorting") linux/TextProcessingGroup -.-> linux/uniq("Duplicate Filtering") linux/TextProcessingGroup -.-> linux/tr("Character Translating") linux/InputandOutputRedirectionGroup -.-> linux/redirect("I/O Redirecting") subgraph Lab Skills linux/cut -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} linux/grep -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} linux/sed -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} linux/awk -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} linux/sort -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} linux/uniq -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} linux/tr -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} linux/redirect -.-> lab-417368{{"如何使用 AWK 根据条件过滤数据"}} end

AWK 基础入门

AWK 是一种强大的文本处理语言,在 Linux/Unix 环境中被广泛用于数据处理、报告生成以及各种其他任务。它以其创造者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的名字命名。

AWK 是一种特定领域的语言,特别适合处理结构化数据,如 CSV 文件、日志文件和其他基于文本的数据源。它提供了一组内置函数和控制结构,便于提取、转换和分析数据。

AWK 的一个关键特性是能够逐行处理数据,并对每行应用一组规则或操作。这使它成为执行以下任务的强大工具:

  • 从 CSV 文件中提取特定字段
  • 过滤和转换日志文件
  • 从结构化数据生成报告
  • 执行复杂的数据操作

以下是一个简单的 AWK 脚本示例,它打印 CSV 文件中每行的第三个字段:

$ cat data.csv
John,Doe,35,New York
Jane,Doe,30,Los Angeles
Bob,Smith,45,Chicago

$ awk -F, '{print $3}' data.csv
35
30
45

在这个示例中,-F, 选项告诉 AWK 使用逗号(, )作为字段分隔符。脚本的 {print $3} 部分告诉 AWK 打印每行的第三个字段。

AWK 是一个通用且强大的工具,可用于广泛的文本处理任务。通过了解 AWK 的基础知识,你在 Linux/Unix 环境中处理数据时可以显著提高工作效率。

利用 AWK 条件和过滤器

AWK 的强大功能之一是能够对正在处理的数据应用条件逻辑和过滤器。这使你能够根据特定标准有选择地处理文本行,使 AWK 成为数据处理和分析的极其通用的工具。

AWK 的条件语句与其他编程语言中的类似,例如 if - else 语句。以下是一个示例,仅当第一个字段匹配 “John” 时才打印 CSV 文件的第三个字段:

$ cat data.csv
John,Doe,35,New York
Jane,Doe,30,Los Angeles
Bob,Smith,45,Chicago

$ awk -F, '$1 == "John" {print $3}' data.csv
35

在这个示例中,脚本的 $1 == "John" 部分是条件,它检查每行的第一个字段是否等于 “John”。如果条件为真,则执行脚本的 {print $3} 部分,打印第三个字段。

AWK 还提供了各种逻辑运算符,如 &&(与)、||(或)和 !(非),可用于创建更复杂的条件。例如,如果第一个字段是 “John” 且第二个字段是 “Doe”,则可以打印第三个字段:

$ awk -F, '$1 == "John" && $2 == "Doe" {print $3}' data.csv
35

AWK 中的过滤器用于选择应处理哪些文本行。BEGINEND 块是特殊的过滤器,分别允许你在处理第一行之前或处理最后一行之后执行代码。以下是一个在打印数据之前打印标题的示例:

$ awk -F, 'BEGIN {print "Name,Age,City"} {print $1","$3","$4}' data.csv
Name,Age,City
John,35,New York
Jane,30,Los Angeles
Bob,45,Chicago

在这个示例中,脚本的 BEGIN {print "Name,Age,City"} 部分在处理文件的第一行之前执行,打印标题。然后,脚本的 {print $1","$3","$4} 部分对文件的每一行执行,打印以逗号分隔的第一个、第三个和第四个字段。

通过利用 AWK 的条件语句和过滤器,你可以创建强大而灵活的文本处理脚本,从而自动化各种数据处理任务。

用于数据处理的 AWK 高级技术

虽然 AWK 的基本功能很强大,但它还提供了一系列可用于更复杂数据处理任务的高级技术。这些技术包括数组处理、用户定义函数和控制流结构。

AWK 最有用的高级特性之一是它处理数组的能力。AWK 数组可用于以更结构化的方式存储和操作数据,从而更轻松地执行复杂操作。以下是一个示例,展示了如何使用数组来统计文本文件中每个单词的出现次数:

$ cat text.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.

$ awk '{
    for (i = 1; i <= NF; i++) {
        word[$i]++
    }
}
END {
    for (w in word) {
        print w, word[w]
    }
}' text.txt
the 2
quick 2
brown 2
fox 2
jumps 2
over 2
lazy 2
dog 2

在这个示例中,word[$i]++ 这一行对输入文件中的每个单词增加 word 数组的值。然后 END 块打印出唯一的单词及其计数。

AWK 还允许你定义自己的函数,可用于封装复杂逻辑并使脚本更具模块化和可重用性。以下是一个定义函数来计算一组数字平均值的示例:

$ cat data.csv
10,20,30
40,50,60

$ awk -F, '
    function avg(arr,   sum, n) {
        n = length(arr)
        for (i = 1; i <= n; i++) {
            sum += arr[i]
        }
        return sum / n
    }
    {
        for (i = 1; i <= NF; i++) {
            nums[i] = $i
        }
        print "Average:", avg(nums)
    }' data.csv
Average: 35
Average: 50

在这个示例中,avg() 函数以数组作为输入,计算其元素的总和并返回平均值。然后对输入文件的每一行调用该函数,并打印出平均值。

通过掌握这些 AWK 高级技术,你可以创建强大而灵活的数据处理脚本,能够处理从文本转换到报告生成及其他更多的各种任务。

总结

AWK 是一种通用且强大的文本处理语言,在 Linux/Unix 环境中被广泛用于数据处理、报告生成以及各种其他任务。本教程涵盖了 AWK 的基础知识,包括其逐行处理数据并对每行应用一组规则或操作的能力。你还学习了如何利用 AWK 的条件语句和过滤器,根据特定标准有选择地处理文本行,使其成为数据分析和处理的高度通用工具。通过掌握本教程中介绍的技术,你在 Linux/Unix 环境中处理数据时将能够显著提高效率和生产力。