1

我有两个 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)

现在我想检查一下,如果Numin1.csvNumin匹配,则匹配的两个文件中 2.csv关联的“名称”是 什么?csvNum

Result : 

1,Bob,Bob
2,Jack,John
3,John,Linda
4,Hawk,Hawk
5,Scot,Scot
..........

如何做到这一点使用comm

4

2 回答 2

2

您可以使用该join命令对第一个字段(即数字)的 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默认情况下对两个文件的第一列执行内部连接。

于 2016-05-02T09:58:05.817 回答
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将多个空格压缩成一个空格并用逗号( ,)替换它

于 2016-05-02T10:02:48.947 回答