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