使用+有效地比较两个csv;300000条记录(使用awk?)

使用+有效地比较两个csv;300000条记录(使用awk?),csv,awk,Csv,Awk,我有两个csv(A有300000行,B有1000000行)。这些记录由一个列ID(关系1-1)关联,但没有相同的列顺序,也不是按ID排序的。我需要获取a中缺少ID的B的700000行 A.ID,A.Field01,A.Field02 2,a,d 4,b,e 1,c,f A.csv A.ID,A.Field01,A.Field02 2,a,d

我有两个csv(A有300000行,B有1000000行)。这些记录由一个列ID(关系1-1)关联,但没有相同的列顺序,也不是按ID排序的。我需要获取a中缺少ID的B的700000行

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
A.csv

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
B.csv

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
B.Field01,B.ID,B.Field02 
g,2,f
f,4,r
h,6,k
a,1,3
(我想选择h、6、k)

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
我想我可以用像sqlite这样的sgbd来解决这个问题,但我相信用像awk这样更简单、更高效的东西也可以解决这个问题

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
我想修改我发现的命令:

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
awk 'ARGIND==1 {x[$0]++; next} !x[$0]' B.csv A.csv
但是,这会比较整行,我不知道如何特别选择A.ID和B.ID作为要比较的字段

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
我还对解决这个问题的其他有效方法感兴趣

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          

干杯

更新:

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
我本以为它的性能会比它好,但我的测试无法证明这一点

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
我用两个文件进行了测试,两个文件都包含700.000行。awk解决方案的速度明显更快

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
awk解决方案需要与B.csv的id列一样多的内存。这就是为什么,对于一个真正(真正!)大的B.csv来说,join解决方案可能是唯一可行的解决方案。如果A.csv和B.csv已经被排序,这当然会表现得更好,因为
sort
命令占用了大部分时间

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          

即使这需要对两个输入文件进行排序,我想在这种情况下,
join
命令也会执行得很好:

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
join -v2 -t, -11 -22 <(sed 1d A.csv|sort -t, -k1,1) <(sed 1d B.csv|sort -t, -k2,2)

更新:

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
我本以为它的性能会比它好,但我的测试无法证明这一点

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
我用两个文件进行了测试,两个文件都包含700.000行。awk解决方案的速度明显更快

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
awk解决方案需要与B.csv的id列一样多的内存。这就是为什么,对于一个真正(真正!)大的B.csv来说,join解决方案可能是唯一可行的解决方案。如果A.csv和B.csv已经被排序,这当然会表现得更好,因为
sort
命令占用了大部分时间

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          

即使这需要对两个输入文件进行排序,我想在这种情况下,
join
命令也会执行得很好:

A.ID,A.Field01,A.Field02   
2,a,d                      
4,b,e                      
1,c,f          
join -v2 -t, -11 -22 <(sed 1d A.csv|sort -t, -k1,1) <(sed 1d B.csv|sort -t, -k2,2)

联接解决方案应该比awk更有效。OP说有30万行,所以它是一个大文件+1我通常更喜欢sed,而不是带有“花哨”选项的头/尾。这里:
sed1d文件
@NinjaGaiden我也希望如此,但我已经用两个文件进行了测试,两个文件都包含700.000行。上述awk解决方案快了约50%。确保
awk
解决方案需要与文件大小相同的内存。对于非常大的文件,连接解决方案可能更好。@hek2mgl:++;我建议您将最后一条评论直接添加到您的答案中(但请注意,在
awk
解决方案中,只有第1列需要作为一个整体存储在内存中)。顺便说一句,
tail-n+
与POSIX兼容-请看是的,时间/空间权衡。一旦你获得了巨大的数据集,使用一个合适的数据库就是最好的选择。join解决方案应该比awk更有效。OP说有30万行,所以它是一个大文件+1我通常更喜欢sed,而不是带有“花哨”选项的头/尾。这里:
sed1d文件
@NinjaGaiden我也希望如此,但我已经用两个文件进行了测试,两个文件都包含700.000行。上述awk解决方案快了约50%。确保
awk
解决方案需要与文件大小相同的内存。对于非常大的文件,连接解决方案可能更好。@hek2mgl:++;我建议您将最后一条评论直接添加到您的答案中(但请注意,在
awk
解决方案中,只有第1列需要作为一个整体存储在内存中)。顺便说一句,
tail-n+
与POSIX兼容-请看是的,时间/空间权衡。一旦你得到了巨大的数据集,使用一个合适的数据库就是最好的选择。谢谢!这正是我想要的。我还感谢其他的贡献和评论。祝你一切顺利,谢谢!这正是我想要的。我还感谢其他的贡献和评论。祝你一切顺利。