返回

利用 Bash 脚本自动化 CSV 文件比较:快速识别匹配和不匹配项

Linux

通过 Bash 脚本比较 CSV 文件:轻松找出匹配和不匹配项

引言

在数据处理和分析中,比较和管理 CSV(逗号分隔值)文件至关重要。手动执行此类任务既耗时又容易出错,因此掌握自动化方法至关重要。本文将指导您编写一个全面的 Bash 脚本,它可以有效地比较两个 CSV 文件,并生成两个新文件,分别列出匹配项和不匹配项。

编写 Bash 脚本

首先,让我们深入探讨用于此目的的 Bash 脚本:

#!/bin/bash

# 输入文件
file_a=$1
file_b=$2

# 输出文件
file_c="matched.csv"
file_d="unmatched.csv"

# 创建临时文件
tmp_a="tmp_a.csv"
tmp_b="tmp_b.csv"

# 获取文件 A 的第 5 列并存储在临时文件中
awk -F "|" '{print $5}' "$file_a" > "$tmp_a"

# 获取文件 B 的第 1 列并存储在临时文件中
awk -F "|" '{print $1}' "$file_b" > "$tmp_b"

# 比较临时文件并输出匹配项
comm -12 "$tmp_a" "$tmp_b" > "$file_c"

# 比较临时文件并输出不匹配项
comm -23 "$tmp_a" "$tmp_b" > "$file_d"

# 清理临时文件
rm "$tmp_a" "$tmp_b"

运行脚本

编写好脚本后,可以通过以下命令运行它:

bash compare_csv.sh file_a.csv file_b.csv

该命令将生成两个输出文件:matched.csv 和 unmatched.csv,分别包含匹配项和不匹配项。

示例输入和输出

为了更清楚地了解这个脚本的运作方式,让我们使用以下示例 CSV 文件:

文件 A:

CT240021313|2024-02-04 00:00:02|CT|1.2.345.6
AB123|2024-02-01 11:22:33|MR|7.8.98.102
PDQ987|2024-02-04 8:50:11|XR|1.23.45.6
PA7531|2024-02-03 9:34:52|CT|6.3.489

文件 B:

1.2.345.6
6.3.489

运行脚本后,将生成以下输出:

文件 C(匹配项):

CT240021313|2024-02-04 00:00:02|CT|1.2.345.6
PA7531|2024-02-03 9:34:52|CT|6.3.489

文件 D(不匹配项):

AB123|2024-02-01 11:22:33|MR|7.8.98.102
PDQ987|2024-02-04 8:50:11|XR|1.23.45.6

常见问题解答

Q1:如何自定义分隔符和列号?
A1: 在脚本中,可以更改分隔符(当前为 |)和列号(当前为 5 和 1)。

Q2:脚本假设什么?
A2: 脚本假设 CSV 文件已经按要比较的列排序。如果未排序,则需要在比较之前进行排序。

Q3:如何处理空值?
A3: 该脚本不特别处理空值。如果 CSV 文件中有空值,它们将被视为普通值。

Q4:脚本能否处理大型 CSV 文件?
A4: 脚本可以在内存中处理大型 CSV 文件,但速度可能会受到机器可用内存的限制。对于非常大的文件,可以使用流处理技术。

Q5:如何提高脚本的性能?
A5: 通过使用更快的排序算法(例如 Merge Sort)和优化临时文件的使用,可以提高脚本的性能。

结论

通过利用本文提供的 Bash 脚本,您可以轻松自动化 CSV 文件比较过程,生成匹配和不匹配项列表。这可以极大地简化数据管理任务,节省时间并提高准确性。掌握此脚本将使您在处理 CSV 文件时更加高效和高效。