使用join命令合并两个csv

时间:2016-03-06 20:44:33

标签: bash csv join merge

我需要在行中合并两个具有不同信息的csv文件。我知道我可以在bash中使用join命令(来自this answer),但我不知道如何将它应用于我的数据。

以下是两个csv的例子:

CSV1:

Andre-Morange.trs;André Morange;2;no;M;58;yes;IDF;
Andre-Morange.trs;Sara enq;1;yes;F;63;yes;IDF / Nice;SARA
Anita Musso trs.trs;Anita Musso;1;no;F;46;yes;?;
Anita Musso trs.trs;Sarah enq;2;yes;F;63;yes;IDF / Nice;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine Ceret.trs;Blanche;4;no;F;25;yes;IDF;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine Ceret.trs;Jean-Pierre;2;no;M;60;yes;IDF;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine Ceret.trs;Reine;3;no;F;60;yes;IDF;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine Ceret.trs;Sarah enq;1;yes;F;63;yes;IDF / Nice;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;Christophe;3;no;M;61;yes;IDF;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;Dame + enqSarah;;;;;;;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;Dame + homme;4;;;;;;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;enqSarah;1;yes;F;63;yes;IDF / Nice;SARA
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;Marie-Anne;2;no;F;62;yes;IDF;

CSV2:

Andre-Morange.trs;André Morange;2;
Andre-Morange.trs;Nasser;3;
Andre-Morange.trs;Sara enq;1;
Andre-Morange.trs;speaker#4;4;
Anita_Musso_trs.trs;Anita Musso;1;
Anita_Musso_trs.trs;Sarah enq;2;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine_Ceret.trs;Blanche;4;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine_Ceret.trs;Jean-Pierre;2;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine_Ceret.trs;Reine;3;
Blanche_Duchemin_Jean_Pierre_Duchemin_Reine_Ceret.trs;Sarah enq;1;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;Christophe;3;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;dame + enqSarah;5;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;dame + homme;4;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;enqSarah;1;
Christophe_Andre_H_62_Marie_Anne_Andre_F_63_5e.trs;Marie-Anne;2;

这里只是两个CSV的子部分。重要的是第一个CSV有更多的列,但行数少于第二个(CSV1有965行和8列,而CSV2有1496行和3列)。但CSV2中的某些行不存在于CSV1中。我想合并这两个文件,最后我添加了CSV2中的所有行,除了CSV1中已经存在的行。

我希望我的问题不会太混乱,我一直在寻找一种方法来做几个小时,我自己很困惑!

1 个答案:

答案 0 :(得分:0)

如果您不仅限于使用加入,您可以使用简短的perl单行解决问题:

cat 1.csv 2.csv | perl -lne '$key = join ";", (split(/;/,$_))[0..2]; print $_ unless $seen{$key}++;'