比较三个.csv文件并输出相似之处

时间:2013-06-26 21:28:16

标签: bash csv

我正在使用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,但这只会输出与我想要做的相反的差异。任何帮助将不胜感激。感谢

4 个答案:

答案 0 :(得分:6)

使用grep

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

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

输出:

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

答案 1 :(得分:1)

使用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

答案 2 :(得分:0)

有点复杂但完成工作

 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) -

答案 3 :(得分:0)

两步法:

$ 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