Unix 使用 comm 比较两个 CSV 文件
Unix Compare Two CSV files using 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)
现在我想检查一下,如果 1.csv
中的 Num
与 2.csv
中的 Num
匹配,两者的关联 "Names" 是什么匹配 Num
的 csv
文件?
Result :
1,Bob,Bob
2,Jack,John
3,John,Linda
4,Hawk,Hawk
5,Scot,Scot
..........
如何使用 comm
实现此目的?
您可以使用 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
分隔符为 space(-t ' '
) 并且在第一个键上,即第一列 (-k 1
) 和 join
默认情况下对两者的第一列执行内部连接文件。
使用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
将多个space压缩成一个space并用逗号代替(,
)
我有两个 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)
现在我想检查一下,如果 1.csv
中的 Num
与 2.csv
中的 Num
匹配,两者的关联 "Names" 是什么匹配 Num
的 csv
文件?
Result :
1,Bob,Bob
2,Jack,John
3,John,Linda
4,Hawk,Hawk
5,Scot,Scot
..........
如何使用 comm
实现此目的?
您可以使用 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
分隔符为 space(-t ' '
) 并且在第一个键上,即第一列 (-k 1
) 和 join
默认情况下对两者的第一列执行内部连接文件。
使用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
将多个space压缩成一个space并用逗号代替(,
)