【问题标题】:Comparison of two CSV files比较两个 CSV 文件
【发布时间】:2022-01-04 01:14:54
【问题描述】:

我正在尝试使用 Awk 比较两个大型 CSV 文件(每个文件超过 5000 行)的内容,但我无法得到我想要的。

这是我的问题:

我有第一个文件 (File1),其中包含名称 ($1) 和城市 ($2) 的列表,其结构如下所示:

john;london
marc;paris
karen;new york
ben;london
vic;dublin

我有第二个文件 (File2),其中包含其他信息,我们在其中找到 File1 的一些名称 ($3):

45456;windows;john;454646
47764;mac;zack;470093
41225;mac;ben;622101
12634;windows;ben;218996
7856;windows;karen;637294
12;mac;finn;878317
2315;windows;beverly;221167
445;windows;lilly;12316
3232;mac;john;601316
4546;mac;fish;305035
487;windows;vic;447421
46464;mac;karen;468154

我想从 File2 中提取名称出现在 File1 中的所有行,同时添加与 File1 中每个名称相关联的城市。这是我正在寻找的结果的示例:

45456;windows;john;454646;london
3232;mac;john;601316;london
7856;windows;karen;637294;new york
46464;mac;karen;468154;new york
41225;mac;ben;622101;london
12634;windows;ben;218996;london
487;windows;vic;447421;dublin

你能帮帮我吗?

【问题讨论】:

  • 必须是awk吗?如果没有,我建议您查看thisthis
  • 请添加到您的问题(不发表评论):您搜索了什么,找到了什么?您尝试过什么,它是如何失败的?

标签: unix awk


【解决方案1】:

构建第一个文件的关联数组,将名称作为索引,将城市作为值。对于第二个文件,检查名称是否包含在数组中,如果是,则打印该行并附上城市。

awk -F';' 'NR==FNR{a[$1]=$2}$3 in a{print $0";"a[$3]}' File1 File2
45456;windows;john;454646;london
41225;mac;ben;622101;london
12634;windows;ben;218996;london
7856;windows;karen;637294;new york
3232;mac;john;601316;london
487;windows;vic;447421;dublin
46464;mac;karen;468154;new york

【讨论】:

    【解决方案2】:

    使用bashGNU sortGNU join

    join -t ';' -1 1 -2 3 <(sort File1) <(sort -t ';' -k 3 File2) -o 2.1,2.2,1.1,2.4,1.2
    

    输出:

    12634;windows;本;218996;伦敦 41225;mac;本;622101;伦敦 45456;windows;约翰;454646;伦敦 3232;mac;约翰;601316;伦敦 46464;mac;卡伦;468154;纽约 7856;windows;卡伦;637294;纽约 487;windows;vic;447421;都柏林

    【讨论】:

    • 我希望加入让选择输出字段变得更简单
    【解决方案3】:

    使用

    csvjoin -d ';' -H -c 3,1 File2 File1 | csvformat -D ';' | tail -n +2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2014-06-14
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多