![열의 값이 변경된 행만 가져오려면 비교하세요.](https://linux55.com/image/190835/%EC%97%B4%EC%9D%98%20%EA%B0%92%EC%9D%B4%20%EB%B3%80%EA%B2%BD%EB%90%9C%20%ED%96%89%EB%A7%8C%20%EA%B0%80%EC%A0%B8%EC%98%A4%EB%A0%A4%EB%A9%B4%20%EB%B9%84%EA%B5%90%ED%95%98%EC%84%B8%EC%9A%94..png)
다음 두 개의 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
=> 파일에 찾고 있는 문자열이 포함되어 있습니다.