두 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

그런데 문제는 이 두 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

훌륭하게 활용하실 수 있습니다밀러그리고 올바른 파일(두 번째 파일)에서 짝을 이루지 않은 행을 가져오는 일반적인 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연결 필드 설정

관련 정보