5

我正在使用 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

4 回答 4

6

使用grep

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

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

输出:

Animal, Color, Age
Cow, White, 3
Parrot, Blue, 2
于 2013-06-26T21:41:48.510 回答
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
于 2013-06-26T21:44:35.573 回答
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
于 2013-06-26T22:08:06.400 回答
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) -
于 2013-06-26T21:31:49.893 回答