이와 같은 두 개의 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
연결 필드 설정