2つのcsvファイルの違いを列別に取得し、その違いを3番目のファイルに書き込む方法は?

2つのcsvファイルの違いを列別に取得し、その違いを3番目のファイルに書き込む方法は?

このような2つの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

2番目のファイル。

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

しかし、問題は、これら2つのcsvファイルを列1と列2でのみ比較する必要があることです。

例えば。

file1.csvの列1 - 列2 = file2.csvの列1 - 列2の場合、これは違いと見なすべきではありません。

最後の列はfile1と異なる場合がありますが、列1と列2は同じでなければならないため、違いはありません。

この目標をどのように達成できますか?

答え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

見事に活用できますミラーそして、正しいファイル(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接続フィールドの設定

関連情報