【问题标题】:Merge two csv with join command使用 join 命令合并两个 csv
【发布时间】:2016-06-20 07:52:48
【问题描述】:

我需要在行中合并两个具有不同信息的 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 中已经存在的行。

我希望我的问题不会太令人困惑,我一直在寻找一种方法来做到这一点几个小时,我自己也很困惑!

【问题讨论】:

  • 你想join基于file1和file2的第一列..对吗?
  • 如果我不清楚,我很抱歉。我希望输出与 CSV1 相同,添加了 CSV2 中包含的所有行,除了 CSV1 中已经存在的 CSV2 行(前三列相同),因为如果它们在 CSV1 中,它们有更多列和因此我想保留的信息。

标签: bash csv join merge


【解决方案1】:

如果你不限于使用join,你可以用一个简短的perl one-liner来解决你的问题:

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

【讨论】:

  • 谢谢,这个解决方案效果很好。我认为加入命令会很容易,但使用 perl 似乎很适合这个问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多