두 개의 큰 텍스트 파일을 비교


32

두 개의 큰 파일이 있습니다 (각 6GB). \n구분 기호 로 줄 바꿈 ( )을 사용 하여 분류되지 않습니다 . 어떻게 차이점을 알 수 있습니까? 24 시간 미만이 소요됩니다.

답변:


45

가장 확실한 대답은 diff 명령을 사용하는 것이며 --speed-large-files 매개 변수를 추가하는 것이 좋습니다.

diff --speed-large-files a.file b.file

분류되지 않은 파일을 언급하므로 먼저 파일을 정렬해야 할 수도 있습니다.

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

두 번째 정렬 출력을 직접 diff로 파이프하여 추가 출력 파일 작성을 저장할 수 있습니다

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

분명히 이것들은 사용 가능한 메모리가 많은 시스템에서 가장 잘 실행되며 충분한 여유 디스크 공간이 필요할 것입니다.

당신이 전에 이것을 시도했는지 여부는 당신의 질문에서 명확하지 않았습니다. 그렇다면 무엇이 잘못되었는지 아는 것이 도움이 될 것입니다 (너무 오래 걸리는 등). 나는 항상 파일 정렬과 diff 명령이 다르게 작동하는 것을 가능하게하는 파일의 도메인 특정 속성이 없다면 사용자 정의 명령뿐만 아니라 최소한 명령을 수행하는 경향이 있음을 발견했습니다.


2
+1. 명명 된 파이프가있는 모든 임시 파일을 생략 할 수 있습니다. 에 대한 출력 mkfifo으로 사용 [ab].file.sorted하기 전에 작성하는 데 사용하십시오 sort. 모두 넣어 sort함께들 &백그라운드에서와 DIFF에 대한 파일 이름으로 파이프를 모두 사용합니다.
krissi

15
@krissi이 구문을 사용하여 동일한 효과를 얻을 수도 있습니다.diff <(command 1) <(command 2)
Michael Mrozek

고마워요 나는 메모리 생각 GB의 몇 있지만 16 기가 바이트 아마존 EC2 인스턴스가 고정 :) 필요
jonasl

7
나와 같은 사람이 <(cmd1) <(cmd2)구문 이 왜 작동 하는지 궁금하다면 (표준 입력을 두 번 리디렉션하는 것처럼 들립니다!) 시도하십시오 echo hello <(cmd1) <(cmd2). 당신은 hello /dev/fd/63 /dev/fd/62갑자기 그것을 분명하게 만드는 것과 같은 것을 보게 될 것입니다 ;)
alex

3
내 경험상 --speed-large-filesRAM이 충분하지 않으면이 옵션이 도움이되지 않습니다. 또한 여러 줄 레코드 구조를 유지하려는 경우 사전 정렬은 도움이되지 않습니다. (@unhammer 의해) 상기 언급 된 옵션은 흥미 있지만 출력 rdiff하고 bsdiff오히려 진이다. bdiffHeirloom Toolbox에서 설치 하는 것은 어려운 작업처럼 보입니다 (Heirloom devtools, 멸종 된 헤더 파일 필요). 노력할만한 가치가 있습니까? 다른 대안이 있습니까?
Christian Pietsch

5

입력을 정렬하고 diff프로그램이 입력을 정렬한다고하면 속도가 엄청납니다. 나는 그런 diff옵션을 알지 못하지만 comm정렬 된 입력을 가정하고 목적에 충분하다면 훨씬 빠를 것입니다.


comm전에는 들어 본 적이 없지만 분명히 coreutils에 들어 있습니다.
theferrit32
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.