使用+有效地比较两个csv;300000条记录(使用awk?)
我有两个csv(A有300000行,B有1000000行)。这些记录由一个列ID(关系1-1)关联,但没有相同的列顺序,也不是按ID排序的。我需要获取a中缺少ID的B的700000行使用+有效地比较两个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
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兼容-请看是的,时间/空间权衡。一旦你得到了巨大的数据集,使用一个合适的数据库就是最好的选择。谢谢!这正是我想要的。我还感谢其他的贡献和评论。祝你一切顺利,谢谢!这正是我想要的。我还感谢其他的贡献和评论。祝你一切顺利。