두 파일 file1과 file 2의 특정 열을 비교하고 파일 1에서 일치하는 각 행을 업데이트합니다.

두 파일 file1과 file 2의 특정 열을 비교하고 파일 1에서 일치하는 각 행을 업데이트합니다.

두 개의 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/s3개의 쉼표(항상 두 번째 및 세 번째 필드)가 있는 패턴이 \1탭( ) 다음에 반복되는 경우 교체
  • s/\t.*/ match not found/불일치 사례를 처리합니다.

관련 정보