Unix使用comm比较两个CSV文件

时间:2016-05-02 09:40:23

标签: bash shell csv unix comm

我有两个CSV文件。 1.csv个文件有718个条目,2.csv有68000个条目。

#cat 1.csv
#Num    #Name  
 1      BoB
 2      Jack
 3      John
 4      Hawk
 5      Scot
 ...........

#cat 2.csv
#Num #Name
1   BoB
2   John
3   Linda
4   Hawk
5   Scot
........

我知道如何比较两个文件,只有一列(Names)可用,并获得匹配的names

#comm -12 <(sort 1.csv) <(sort 2.csv)

现在我想检查一下,如果Num中的1.csvNum中的2.csv匹配,那么关联的&#34;名称&#34;是什么?来自匹配csv的{​​{1}}个文件?

Num

如何使用Result : 1,Bob,Bob 2,Jack,John 3,John,Linda 4,Hawk,Hawk 5,Scot,Scot .......... 实现此目的?

2 个答案:

答案 0 :(得分:2)

您可以使用join命令在第1个字段上的2个csv文件上执行内连接,即数字。这是一个例子:

$ cat f1.csv 
1      BoB
2      Jack
3      John
4      Hawk
5      Scot
6      ExtraInF1
$ cat f2.csv 
1   BoB
3   Linda
4   Hawk
2   John
5   Scot
7   ExtraInF2
$ join <(sort -t ' ' -k 1 f1.csv) <(sort -t ' ' -k 1 f2.csv)
1 BoB BoB
2 Jack John
3 John Linda
4 Hawk Hawk
5 Scot Scot
$ join <(sort -t ' ' -k 1 f1.csv) <(sort -t ' ' -k 1 f2.csv) | tr -s ' ' ,
1,BoB,BoB
2,Jack,John
3,John,Linda
4,Hawk,Hawk
5,Scot,Scot
$

注意我添加了几个虚拟行(编号6和7),并且还注意到它们没有出现在输出中,因为它们不存在于两个文件中。

<(sort -t ' ' -k 1 f1.csv)表示流程替换,即替换此处的流程输出。 sort将分隔符作为空格(-t ' ')并在第一个键上,即第一列(-k 1)和join默认情况下在两个文件的第一列上执行内部联接。

答案 1 :(得分:1)

使用join命令

进行内连接的另一个单行程序
join -1 1 -2 1 <(sort 1.csv) <(sort 2.csv) |  tr -s ' ' ,

-1 2   : sort on file 1, 1st field
-2 1   : sort on file 2, 1st field

tr -s将多个空格压缩到一个空格中,并用逗号替换它(,