열의 값이 변경된 행만 가져오려면 비교하세요.

열의 값이 변경된 행만 가져오려면 비교하세요.

다음 두 개의 csv 파일이 제공됩니다(이전에 정렬됨).

파일 1

a,1,val1
b,2,val2
c,3,val3
d,4,val4
e,5,val5
f,6,val6
g,7,val7

파일 2

a,1,val1
b,2,val2
c,3,val3x
e,5,val5x
g,7,val7
h,8,val8

세 번째 열의 값이 변경된 행만 비교하고 가져오려면 어떻게 해야 합니까? 나는 다음과 같은 것을 얻을 것으로 기대합니다 :

c,3,val3x
e,5,val5x

동일한 줄, 추가 또는 삭제된 줄은 무시해야 하며 수정된 줄에만 관심이 있습니다. 나는 Pearl, Python 등 대신 Linux 기본 명령을 사용하는 것을 선호합니다. 회사에서 수천만 줄의 파일을 처리해야 하는데, 성능이 좋은 것을 찾고 있어요. 사용해 보았지만 diff -U 0작업에 적합한 도구가 아닌 것 같습니다.

답변1

어크는 어때?

$ awk -F, 'NR==FNR{a[$1,$2]=$3; next} ($1,$2) in a && $3 != a[$1,$2]' file1 file2
c,3,val3x
e,5,val5x

고급 CSV 기능(특히 간단한 접근 방식으로는 처리할 수 없는 인용된 CSV 필드에 포함된 쉼표)을 처리해야 하는 경우 awk -F,항상 Python 기반 csvkit 도구 모음이 있습니다. 특히 다음을 사용할 수 있습니다 csvsql.

$ csvsql -H --query '
    SELECT file2.* FROM file1 INNER JOIN file2 ON file1.a = file2.a AND file1.b = file2.b 
    WHERE file1.c != file2.c
  ' file1 file2 2>/dev/null
a,b,c
c,3,val3x
e,5,val5x

답변2

sed-grep 파이프라인을 사용하여 다음을 수행할 수 있습니다.

$ sed -e 's/$/x/' file1 | grep -xFf - file2
c,3,val3x
e,5,val5x

노트:-

  • 먼저 file2의 데이터를 기반으로 검색할 file1 데이터를 준비합니다.
  • -x=> 일부 대신 전체 줄을 일치시킵니다.
  • -F=> 정규식 일치 대신 문자열 일치의 경우
  • -f=> 파일에 찾고 있는 문자열이 포함되어 있습니다.

관련 정보