我有两个这样的 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
设置连接字段