2016-03-06 168 views
1

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

因此,这里有两个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中的行之外。

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

+0

到'join'基于file1和file2..right的第1列? – ritesht93

+0

如果我不清楚,我很抱歉。我希望输出与CSV1中的所有行一样,CSV2中包含的所有行除外,因为CSV1中的CSV2行已经存在(具有相同的前三列),因为如果它们位于CSV1中,则它们具有更多列,因此我想保留信息。 –

+0

如果你可以看看:[我应该怎么做当有人回答我的问题?] – Cyrus

回答

0

如果不限于使用连接,您可以用很短的perl的解决你的问题一行代码:

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

谢谢,这个解决方案工作得很好。我认为一个连接命令本来很容易,但是使用perl对于这个问题似乎很棒! –