如何按列获取两个 csv 文件的差异并将差异写入第三个文件?

如何按列获取两个 csv 文件的差异并将差异写入第三个文件?

我有两个这样的 csv 文件;

422174,XN,20.99,2020-09-01,2022-01-20 20:20:28.613+00
421348,SB,21.99,2021-01-26,2022-01-20 20:20:28.613+00
885176,XN,41.80,2021-11-17,2022-01-20 20:20:28.613+00
881751,SB,12.81,2020-09-01,2022-01-20 20:20:28.613+00
722483,XN,67.50,2020-09-01,2022-01-20 20:20:28.613+00

第二个文件;

422174,XN,25.99,2020-09-01,2022-01-21 20:20:28.613+00
667843,XN,22.99,2020-09-01,2022-01-20 20:20:28.613+00
421348,SB,21.99,2021-01-26,2022-01-20 20:20:28.613+00
885176,XN,41.80,2021-11-17,2022-01-20 20:20:28.613+00
881751,SB,12.81,2020-09-01,2022-01-20 20:20:28.613+00
156734,XN,34.50,2020-09-01,2022-01-20 20:20:28.613+00

输出应该是;

667843,XN,22.99,2020-09-01,2022-01-20 20:20:28.613+00
156734,XN,34.50,2020-09-01,2022-01-20 20:20:28.613+00

但问题是,我只需要按第 1 列和第 2 列比较这两个 csv 文件。

例如;

如果 file1.csv 的第 1 列 - 第 2 列 = file2.csv 的第 1 列 - 第 2 列,则不应将其视为差异。

因为最后一列可以与file1不同,但column1和column2应该相同,这意味着没有区别。

我怎样才能实现这个目标?

答案1

使用任何 awk:

$ awk -F, 'NR==FNR{a[$1,$2]; next} !(($1,$2) in a)' file1.csv file2.csv
667843,XN,22.99,2020-09-01,2022-01-20 20:20:28.613+00
156734,XN,34.50,2020-09-01,2022-01-20 20:20:28.613+00

答案2

你可以使用伟大的磨坊主以及一个经典的 JOIN 操作,从正确的文件(第二个)中获取不配对的行:

跑步:

mlr --csv -N join --np --ur -j 1,2 -f input_01.csv then unsparsify input_02.csv

你得到

667843,XN,22.99,2020-09-01,2022-01-20 20:20:28.613+00
156734,XN,34.50,2020-09-01,2022-01-20 20:20:28.613+00

一些注意事项:

  • -N设置您的 csv 没有标题
  • --np没有配对记录
  • --ur从正确的文件中发出不配对的记录
  • -j 1,2设置连接字段

相关内容