【问题标题】:Comparing three .csv files and outputting similarities比较三个 .csv 文件并输出相似性
【发布时间】:2013-06-24 05:22:56
【问题描述】:

我正在使用 bash 脚本编写一个项目,以读取三个不同的 .csv 文件并输出相似的行。 这三个 .csv 文件的格式相同,信息相同,但第二列可能不同。 例如,如果我有三个 csv 文件,分别命名为 A.csv、B.csv 和 C.csv。

A.csv
Animal, Color, Age
Dog, Brown, 9
Cow, White, 3
Cat, Black, 5
Parrot, Blue, 2

B.csv
Animal, Color, Age
Dog, Black, 9
Cow, White, 3
Cat, Brown, 5
Parrot, Blue, 2

C.csv
Animal, Color, Age
Dog, Brown, 9
Cow, White, 3
Cat, Tan, 5
Parrot, Blue, 2

运行程序后,我希望得到如下输出:

Animal, Color, Age
Cow, White, 3
Parrot, Blue 2

我已经阅读了 diff3,但它只输出与我想要做的相反的差异。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: bash csv


    【解决方案1】:

    两步法:

    $ comm -12 <(sort A.csv) <(sort B.csv) > tmp
    
    $ comm -12 <(sort tmp) <(sort C.csv)
    Animal, Color, Age
    Cow, White, 3
    Parrot, Blue, 2
    

    【讨论】:

      【解决方案2】:

      使用awk

      awk '
      FILENAME==ARGV[1]{a[$0]++;next}
      FILENAME==ARGV[2] && ($0 in a){b[$0]++;next} 
      $0 in b' A.csv B.csv C.csv 
      

      示例文件的输出:

      Animal, Color, Age
      Cow, White, 3
      Parrot, Blue, 2
      

      【讨论】:

      • 嗨,这个解决方案在我运行它时有效,但是,它以一种方式输出,其中一行的最后一项连接到下一行的第一项。所以从这个例子中,如果你从记事本中查看 .csv 文件,你会得到:Animal, Color, AgeCow, White, 3Parrot, Blue, 2 我想知道如何在每一行的末尾获得换行符。谢谢
      • awk ' FILENAME==ARGV[1]{a[$0]++;next} FILENAME==ARGV[2] &amp;&amp; ($0 in a){b[$0]++;next} $0 in b{sub(/$/,"\r");}1' A.csv B.csv C.csv 应该有帮助
      • 嗨,它似乎可以工作,但是行的顺序现在已经关闭了。
      • 由于是三路比较,所以顺序总是最后一个文件。
      • 怎么样,三个文件中的行顺序是一样的,所以我不确定它为什么会改变。而且,我更仔细地看了看,发现有些行没有得到修复。
      【解决方案3】:

      使用grep

      grep A.csv -f B.csv | grep -f C.csv
      

      grep -f FILE 从 FILE 中获取模式。

      输出:

      Animal, Color, Age
      Cow, White, 3
      Parrot, Blue, 2
      

      【讨论】:

        【解决方案4】:

        有点复杂,但可以完成工作

         sort <(tail -n +2  A.csv) <(tail -n +2 B.csv) | 
         uniq -d | sort <(tail -n +2  C.csv) - |
         uniq -d | cat <(head -1 A.csv) -
        

        【讨论】:

          猜你喜欢
          • 2023-03-05
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 1970-01-01
          相关资源
          最近更新 更多