比较两个 csv 文件并将匹配的数据提取到新的 csv 文件中

比较两个 csv 文件并将匹配的数据提取到新的 csv 文件中

我有两个具有相似内容/数据的 csv 文件。


文件1.csv

ADIS
BAP3
Mercury_System
nxh-2003
DR_FeatureUP_PT

文件2.csv

ADIS,projects.adis
EcoSystems,projects.ecosystems
em1xxxsw,projects.em1xxxsw
BAP3,projects.bap3
Dirana4,projects.dirana4
Mercury_System,projects.mercury_system
nxh-2003,projects.nxh-2003
DocStore,projects.docstore
DR_FeatureUP_PT,projects.dr_featureup_pt

期望的输出.csv

ADIS,projects.adis
BAP3,projects.bap3
Mercury_System,projects.mercury_system
nxh-2003,projects.nxh-2003
DR_FeatureUP_PT,projects.dr_featureup_pt

请让我知道用于此类查询的命令。

答案1

使用磨坊主( mlr) 连接指定字段上的两个 CSV 数据集ADIS

$ mlr --csv join -j ADIS -f file1.csv file2.csv
ADIS,projects.adis
BAP3,projects.bap3
Mercury_System,projects.mercury_system
nxh-2003,projects.nxh-2003
DR_FeatureUP_PT,projects.dr_featureup_pt

如果ADIS实际上不是字段名称,并且两个 CSV 文件是无标头,然后使用以下内容(将输入读取为无标头 CSV 并在操作中使用字段编号而不是字段名称join):

$ mlr --csv -N join -j 1 -f file1.csv file2.csv
ADIS,projects.adis
BAP3,projects.bap3
Mercury_System,projects.mercury_system
nxh-2003,projects.nxh-2003
DR_FeatureUP_PT,projects.dr_featureup_pt

第二个命令的输出看起来与第一个命令相同。但是,每个文件中的第一行不再解释为标题行,而是解释为数据字段的记录。

无论输入数据文件是 DOS 还是 Unix 文本文件,这都可以工作。

答案2

使用 grep;

grep -Ff file1.csv file2.csv > outfile.csv

使用 awk

awk -F, 'NR==FNR{seen[$0]++;next} ($1 in seen)' file1.csv file2.csv > outfile.csv

答案3

您可以通过在 shell 中执行一个简单的脚本来解决这个问题。尝试用这个:

while read i; do grep $i ./file2.csv >> output.csv; done < file1.csv

它将创建一个名为 output.csv 的新文件,其中包含您期望的结果。您需要在存储文件 file1.csv 和 file2.csv 的文件夹上运行它。

答案4

使用 Bash 进程替换,您可以对文件进行排序,然后“加入”它们。

join -t, <(sort file1.csv) <(sort file2.csv) > output.csv

相关内容