使用 Awk 处理多个输入文件


简介

Awk 是一种功能强大的文本处理工具,开发人员、系统管理员和分析师广泛使用它来以各种方式处理数据。它是一个多功能的工具,可以处理文本文件、提取数据并将其转换为各种格式。Awk 的关键特性之一是能够同时处理多个输入文件,使其成为批处理任务的理想选择。在本文中,我们将探讨如何使用 Awk 处理多个输入文件,并检查一些在实践中如何使用它的示例。

使用 Awk 处理多个输入文件

Awk 是一种命令行工具,旨在处理文本文件。默认情况下,Awk 从标准输入 (stdin) 读取输入,可以从文件重定向或从另一个命令管道化。但是,Awk 也可以同时处理多个输入文件,这对于批处理任务很有用。

在处理多个输入文件时,Awk 将每个文件视为一个独立的输入数据流。它按顺序读取每个文件,依次处理每个文件的输入数据。这意味着,如果您有多个包含相同类型数据的文件,您可以使用 Awk 一次性处理所有这些文件,而无需分别处理每个文件。

从多个输入文件读取数据

要从多个输入文件读取数据,您可以在运行 Awk 时将文件名指定为参数。例如,假设您有两个文件 file1.txt 和 file2.txt,它们包含以下数据:

file1.txt

apple
banana
orange

file2.txt

carrot
potato

您可以使用 Awk 读取这两个文件中的数据并将其打印到屏幕上,使用以下命令:

awk '{print}' file1.txt file2.txt

此命令告诉 Awk 读取 file1.txt 和 file2.txt 中的数据并将其打印到屏幕上。'{print}' 命令用于指定 Awk 应该对每行输入数据执行的操作,在本例中,是将其打印到屏幕上。

合并来自多个输入文件的数据

使用 Awk 处理多个输入文件的另一种方法是将文件中的数据合并到单个输出流中。如果您有多个包含相关数据的文件并且想要将其合并到单个数据集中,这将很有用。为此,您可以使用 cat 命令连接文件,然后将输出传递到 Awk。

例如,假设您有两个文件 file1.txt 和 file2.txt,它们包含以下数据:

file1.txt

1,apple
2,banana
3,orange

file2.txt

1,carrot
2,potato

您可以使用以下命令将这两个文件中的数据合并到单个输出流中:

cat file1.txt file2.txt | awk -F ',' '{print $1,$2}'

此命令使用 cat 命令将 file1.txt 和 file2.txt 连接到单个输出流中。然后将输出流传递到 Awk,Awk 使用 -F 选项将逗号 (',') 作为字段分隔符。'{print $1,$2}' 命令用于打印每行输入数据的第一和第二字段,并用空格分隔。

处理来自多个输入文件的数据 −

处理来自多个输入文件的数据可能涉及各种操作,例如过滤、排序和聚合。Awk 提供了广泛的内置函数,可用于执行这些操作,使其成为强大的数据处理工具。

例如,假设您有两个文件 file1.txt 和 file2.txt,它们包含以下数据:

file1.txt

1,apple,0.5
2,banana,0.4
3,orange,0.3

file2.txt

1,carrot,0.2
2,potato,0.1

您可以使用 Awk 处理这两个文件中的数据并计算所有水果和蔬菜的总重量,使用以下命令:

awk -F ',' '{if ($2 == "apple" || $2 == "banana" || $2 == "orange") sum += $3; else sum += 0.0} END {print sum}' file1.txt file2.txt

此命令使用 -F 选项指定逗号 (',') 作为字段分隔符。然后,它使用 if 语句从 file2.txt 中过滤掉非水果数据并计算这两个文件中所有水果的总重量。sum 变量初始化为零,并且对于与水果条件匹配的每一行输入数据,它都会递增。END 块用于打印 sum 的最终值。

使用 Awk 处理多个输入文件的示例

计算目录中所有文件的大小总和

假设您想要计算目录及其子目录中所有文件的大小总和。您可以使用以下命令生成目录及其子目录中所有文件的列表,然后将输出传递到 Awk 以计算总大小:

find /path/to/directory -type f -print0 | xargs -0 ls -l | awk '{sum += $5} END {print sum}'

此命令使用 find 命令生成目录及其子目录中所有文件的列表,并使用 xargs 命令将列表传递到 ls -l 以生成每个文件的详细列表。然后将 ls -l 的输出传递到 Awk,Awk 使用 $5 字段以字节为单位计算所有文件的大小总和。END 块用于打印 sum 的最终值。

合并两个 CSV 文件

假设您有两个包含相关数据的 CSV 文件,并且想要将其合并到单个 CSV 文件中。您可以使用以下命令合并文件并将结果输出到新文件

awk 'FNR==1 && NR!=1 {next;}{print}' file1.csv file2.csv > merged.csv

此命令使用 FNR 和 NR 内置变量来确保标题行仅在输出文件中包含一次。第一个文件正常处理,但如果当前行号 (FNR) 等于 1 并且总行号 (NR) 不等于 1,则跳过第二个文件。然后将结果输出重定向到一个新文件 merged.csv。

结论

Awk 是一种功能强大的文本处理工具,可用于处理多个输入文件。它提供了一系列广泛的内置函数,可用于以各种方式处理数据,使其成为批处理任务的理想选择。通过组合多个输入文件,Awk 可以帮助您简化数据处理工作流程并提高数据分析任务的效率。

更新于: 2023-03-24

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.