두 개의 플랫 파일 A와 B를 비교하여 B의 모든 레코드가 A에도 있는지 확인합니다.

두 개의 플랫 파일 A와 B를 비교하여 B의 모든 레코드가 A에도 있는지 확인합니다.

두 개의 플랫 파일 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

첫 번째 열은 고유 키입니다. 공통 열은 열 bc입니다 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사용할 수 있습니다 . 관련 데이터가 파일 A의 열 1,3, 10이고 파일 B의 열 1,2, 3이라고 가정합니다. A에서 열을 선택하고 이를 키워드 일치 파일로 사용하고 파일 B에 해당 열이 있는지 역으로 확인합니다. . 파일 B에 파일 A에서 추출된 일치하는 줄에 없는 줄이 있는 경우 해당 줄이 표시됩니다. 모두 일치하면 출력이 없습니다(B는 A의 하위 집합이므로).grep
cut

grep -wvf <( cut -f1,3,10 fileA ) fileB

또는 파일 B에 세 개 이상의 열이 있는 경우:

grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )

관련 정보