두 개의 CSV 파일을 비교하고 첫 번째 파일에서 일치하는 각 행을 업데이트하려고 합니다.
예:
파일 1.csv
col1,col2,col3,col4
1,11,111,1111
2,22,222,2222
3,33,333,3333
파일 2.csv
col1,col2,col3,col4
X,11,111,XXXX
Y,22,222,YYYY
Z,ZZ,ZZZ,ZZZZ
이제 이 두 파일 사이의 col2와 col3을 비교하고 일치하는 항목이 발견되면 파일 1을 업데이트하여 일치하는 줄을 얻으려고 합니다.
출력 file1.csv
:
col1,col2,col3,col4
1,11,111,1111 match found
2,22,222,2222 match found
3,33,333,3333 match not found
답변1
사용awk
$ awk -F, 'NR==FNR {a[$2,$3];next} FNR>1 {$0=$0 (($2,$3) in a?" match found" : " match not found")}1' file2.csv file1.csv
col1,col2,col3,col4
1,11,111,1111 match found
2,22,222,2222 match found
3,33,333,3333 match not found
답변2
(1) 필드 구분 기호를 제외하고 파일에 쉼표가 없고 (2) 두 필드가 모두 일치해야 하는 경우 paste
다음 명령을 사용하여 일치 항목을 파일화하고 처리 할 수 있습니다 sed
.
paste file1.csv file2.csv | sed '1s/\t.*//p;1d;s/\(,.*,.*,\)\(.*\)\t.*\1.*/\1\2 match found/;s/\t.*/ match not found/'
( \t
리터럴 탭 문자를 나타내며 ctrl-v를 통해 입력한 다음 Tab 키를 누릅니다)
1s/\t.*//p
첫 번째 줄을 인쇄하고 먼저 중복 항목을 제거한1d
다음 첫 번째 줄에서 추가 작업을 중지합니다.s/\(,.*,.*,\)\(.*\)\t.*\1.*/\1\2 match found/
s
3개의 쉼표(항상 두 번째 및 세 번째 필드)가 있는 패턴이\1
탭( ) 다음에 반복되는 경우 교체s/\t.*/ match not found/
불일치 사례를 처리합니다.