두 개의 CSV 파일을 비교하고 고유한 기록을 표시하는 방법은 무엇입니까?

두 개의 CSV 파일을 비교하고 고유한 기록을 표시하는 방법은 무엇입니까?

아래와 같이 두 개의 csv 파일이 있고 file1과 file2를 비교하고 싶습니다. 레코드가 file2에 있으면 file1에서 전체 행을 삭제해야 합니다. 여기서 비교되는 필드는 원본 파일의 위치 11에 있는 ID입니다.

파일 1.CSV

"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","12","","31420","TYPE1"
"A","XY","100","13","","31420","TYPE1"

파일 2.CSV

"ID"
"11"
"12"
"25"

예상 출력

"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","13","","31420","TYPE1"

답변1

다음 유틸리티를 사용하십시오csvkit(내 Ubuntu 시스템의 패키지 python3-csvkit):

$ csvsql --query '
  SELECT * FROM FILE1 WHERE ID NOT IN (SELECT ID FROM FILE2)
' FILE1.CSV FILE2.CSV | csvformat -U1
"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","13","","31420","TYPE1"

답변2

밀러(https://github.com/johnkerl/miller/releases/tag/5.4.0) 예

mlr --csv join --np --ul -j ID -f input_01.csv input_02.csv

몇 가지 참고사항:

  • --np페어링 기록을 보내지 마세요
  • --ul왼쪽 파일에서 페어링되지 않은 레코드 내보내기

왼쪽 파일은 input_01.csv 입니다.

"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","12","","31420","TYPE1"
"A","XY","100","13","","31420","TYPE1"

답변3

grep -v -wf file2.csv file1.csvfile1.csv단어가 포함되지 않은 모든 줄을 인쇄합니다 file1.csv.

물론 이제 헤더 행이 누락되었습니다. 필요한 경우 다음을 수행하십시오.

$ head -n1 file1.csv;grep -v -wf file2.csv file1.csv

첫 번째 행이 file2.csv단어가 일치하지 않아야 하는 열을 정의하는 경우 awk해결 방법은 다음과 같습니다.

$ awk -v FS="," '
    NR==FNR && NR==1 {column=$1; next;} # save the column name to which one will compare
    NR==FNR {data[$1]++; next;} # save the list of words to match again
    NR!=FNR && FNR==1 {print; for(i=1;i<=NF;i++) {if($i==column) c=i}; next;}  # print header line of file1, find column number to which one will compare
    {if ($c in data == 0) print} # for any following line check if the word is not in our list
' file2.csv file1.csv

관련 정보