首页 > 解决方案 > MERGE 2 csv 文件使用 BASH 或 Awk 删除重复项

问题描述

我有 2 个 csv 文件,如下所示:

大集.csv

0,116070742,34991221138,false,2020-02-02 15:24:30,2020-02-01 03:03:30
0,116070741,34617138590,false,2020-02-02 15:24:30,2020-02-02 15:24:30
0,116070743,34603492144,false,2020-02-02 15:24:31,2020-02-02 15:24:31

Small_set.csv

0,116070777,34991221138,false,2020-02-02 15:24:30,2020-02-02 15:24:30
0,116070422,34617138999,false,2020-02-02 15:24:30,2020-02-02 15:24:30

要求:

我有 2 个不同大小的 csv 文件。我想通过匹配第 3 列(例如此处给出的 34991221138)并从 Large_set.csv 中删除重复项来合并 2 个 csv 文件。

预期结果:

0,116070777,34991221138,false,2020-02-02 15:24:30,2020-02-02 15:24:30
0,116070741,34617138590,false,2020-02-02 15:24:30,2020-02-02 15:24:30
0,116070743,34603492144,false,2020-02-02 15:24:31,2020-02-02 15:24:31
0,116070422,34617138999,false,2020-02-02 15:24:30,2020-02-02 15:24:30

我尝试使用cat Large_set.csv Small_set.csv > new_set.csv,但我仍然无法从第一个文件中删除重复项。也检查了解决方案,但由于一些限制,我的要求是使用 bash 脚本或 awk(不是 python 或任何其他工具,如 csvmerge)。

标签: bashshellcsvawkmerge

解决方案


如果您不关心输出顺序,那么使用 GNU sort for -s

$ sort -t, -k3,3 -u -s small_set.csv large_set.csv
0,116070743,34603492144,false,2020-02-02 15:24:31,2020-02-02 15:24:31
0,116070741,34617138590,false,2020-02-02 15:24:30,2020-02-02 15:24:30
0,116070422,34617138999,false,2020-02-02 15:24:30,2020-02-02 15:24:30
0,116070777,34991221138,false,2020-02-02 15:24:30,2020-02-02 15:24:30

如果您确实关心,那么您必须告诉我们该输出顺序应该是什么,因为它在您的问题中并不明显。


推荐阅读