아래와 같이 두 개의 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.csv
file1.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