두 개의 플랫 파일 A와 B가 있습니다. A는 수백만 개의 레코드를 포함하는 대용량 파일이고 B는 A의 하위 집합이어야 합니다. A에는 고유 키가 있는 20개의 열이 있고, B에는 동일한 고유 키가 있는 5개의 열이 있습니다. B와 A를 비교하여 파일 B에 있는 레코드가 파일 A에도 존재하고 해당 열에 동일한 데이터가 있는지 확인하는 방법을 알려주실 수 있습니까?
답변1
내 명령을 보여주기 위해 두 개의 파일을 만들었습니다.
file1
:
1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
3 a3 b3 c3 d3 e3
4 a4 b4 c4 d4 e4
5 a5 b5 c5 d5 e5
file2
:
2 b2 c2 e2
4 b4 c4 xx
5 b5 c5 e5
첫 번째 열은 고유 키입니다. 일반적인 열에는 b
, c
및 가 포함됩니다 e
. 일반적인 줄은 2
, 4
및 입니다 5
. 행 4
의 열에 다른 값이 있습니다 e
.
출력이 포함된 명령은 다음과 같습니다.
$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1) file2
4 b4 c4 xx
파일이 아직 정렬되지 않은 경우 다음을 수행할 수 있습니다.
$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1 | sort) <(sort file2)
설명하다:
cut -d' ' -f1,3,4,6 file1
파일의 필드 번호 1, 3, 4, 6을 인쇄합니다. 필드는 공백으로 구분됩니다. 필드가 쉼표로 구분된 경우 cut
다음을 사용하세요.cut -d','
<( ... )
comm -1 -3 file1 file2
file2에 고유한 줄을 인쇄합니다.
지침:
cut
구분 기호가 필드에 문자로 나타날 수 있으면 문제가 발생합니다.
예를 들어:
"field1","field2,stillfield2","field3"
cut
쉼표가 "field2,stillfield2"
필드의 일부라는 것을 이해하지 못할 것입니다.
파일이 다음과 같다면 csv 처리 기능이 내장된 프로그래밍 언어를 사용하는 것이 가장 좋습니다. 예를 들어파이썬.
답변2
파일에 말한 대로 다른 열이 있는 경우 가장 쉬운 방법은 선택한 언어로 작은 프로그램을 작성하는 것입니다. 파일의 행이 동일한 구조가 아닌 경우에는 별로 도움이 되지 않습니다 diff
.comm
답변3
및 솔루션 외에도 이 솔루션을 comm
사용할 diff
수도 있습니다 grep
.
관련 데이터가 파일 A의 열 1,3, 10이고 파일 B의 열 1,2, 3이라고 가정합니다. A에서 선택한 열을 사용하고 cut
이를 키워드로 사용하여 파일을 일치시키고 파일 B에 해당 항목이 있는지 역방향으로 확인합니다. 파일 A에서 추출된 일치하는 행에 없는 행이 파일 B에 있으면 표시됩니다. 모두 일치하면 출력이 없습니다(B는 A의 하위 집합이어야 하기 때문).
grep -wvf <( cut -f1,3,10 fileA ) fileB
또는 파일 B에 3개 이상의 열이 있는 경우:
grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )