根据列值比较csv文件



我有两个大的csv文件:

File1.csv

id,name,code
1,dummy,0
2,micheal,3
5,abc,4

File2.csv

id,name,code
2,micheal,4
5,abc,4
1,cd,0

我想根据id比较两个文件,如果其中任何列不匹配,我想输出这些行。

例如,对于id 1名称不同,对于id 2代码不同,输出应该是:

输出

1,cd,0
2,micheal,4

是的,两个文件都有相同的id,但顺序可能不同。

我想写一个脚本,可以给我以上的输出。

如果你需要File2中没有与File1配对的东西,你可以使用Miller和这个简单的命令

mlr --csv join --np --ur  -j id,name,code -f File1.csv File2.csv >./out.csv

在输出中,您将拥有

+----+---------+------+
| id | name    | code |
+----+---------+------+
| 2  | micheal | 4    |
| 1  | cd      | 0    |
+----+---------+------+
awk -F, 'NR==FNR && FNR!=1 { map[$0]=1;next } FNR!=1 { if ( !map[$0] ) { print } }' File1.csv File2.csv

将字段分隔符设置为逗号。对于第一个文件(NR==FNR(,创建一个数组映射,将该行作为第一个索引。然后,对于第二个文件,如果映射中没有该行的条目,则打印该行。

查找文件之间差异的首选工具当然是diff。在这里,这些文件是逗号分隔的还是其他格式的并不重要,因为你只对不同的行感兴趣。

知道两个文件都包含相同的ID,这就非常容易了,尽管它们不一定按相同的顺序,这需要首先将它们都sort

在您的示例中,您希望File2中的行作为输出,因此通过grep^>运行diff输出将获得该结果。

最后,让我们使用cut:去掉diff将插入的输出行开头的两个附加字符

diff <(sort File1.csv) <(sort File2.csv) | grep '^>' | cut -c3-

相关内容

  • 没有找到相关文章

最新更新