我有两个具有相似内容/数据的 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