Khác nhau hai tập tin văn bản lớn


32

Tôi có hai tệp lớn (mỗi tệp 6GB). Chúng không được sắp xếp, với linefeed ( \n) là dấu phân cách. Làm thế nào tôi có thể khác họ? Nó sẽ mất dưới 24h.

Câu trả lời:


45

Câu trả lời rõ ràng nhất là chỉ sử dụng lệnh diff và có lẽ nên thêm tham số --speed-Large-files vào nó.

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

Bạn đề cập đến các tệp chưa được sắp xếp vì vậy có thể bạn cần sắp xếp các tệp trước

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

bạn có thể lưu tạo một tệp đầu ra bổ sung bằng cách chuyển trực tiếp đầu ra loại thứ 2 vào diff

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

Rõ ràng những thứ này sẽ chạy tốt nhất trên một hệ thống có nhiều bộ nhớ khả dụng và bạn cũng có thể sẽ cần nhiều dung lượng đĩa trống.

Không rõ câu hỏi của bạn cho dù bạn đã thử những điều này trước đây. Nếu vậy thì sẽ rất hữu ích khi biết những gì đã sai (mất quá nhiều thời gian, v.v.). Tôi luôn thấy rằng các lệnh stock sort và diff có xu hướng thực hiện ít nhất cũng như các lệnh tùy chỉnh trừ khi có một số thuộc tính rất đặc trưng của các tệp giúp cho có thể thực hiện các thao tác khác nhau.


2
+1. Bạn có thể bỏ qua tất cả các tệp tạm thời với các đường ống được đặt tên. Sử dụng mkfifođể tạo [ab].file.sortedtrước khi sử dụng chúng làm đầu ra cho sort. Đặt cả hai sortvới &nền và sử dụng cả hai đường dẫn làm tên tệp cho diff.
krissi

15
@krissi Bạn cũng có thể thực hiện hiệu ứng tương tự bằng cú pháp này:diff <(command 1) <(command 2)
Michael Mrozek

Cảm ơn đã làm việc. Tôi cần một vài GB bộ nhớ nhưng một phiên bản Amazon EC2 16 GB đã sửa nó :)
jonasl

7
Nếu ai đó như tôi tự hỏi tại sao <(cmd1) <(cmd2)cú pháp hoạt động (vì nó nghe giống như chuyển hướng đầu vào tiêu chuẩn hai lần!), Hãy thử echo hello <(cmd1) <(cmd2). Bạn sẽ thấy một cái gì đó giống như hello /dev/fd/63 /dev/fd/62đột nhiên làm cho nó rõ ràng;)
alex

3
Theo kinh nghiệm của tôi, --speed-large-filestùy chọn không giúp ích gì nếu bạn không có đủ RAM. Ngoài ra, sắp xếp trước không hữu ích nếu bạn có cấu trúc bản ghi nhiều dòng bạn muốn giữ lại. Các tùy chọn được đề cập ở trên (bởi @unhammer) rất thú vị, nhưng đầu ra từ rdiffbsdiffkhá nhị phân. Cài đặt bdifftừ Hộp công cụ gia truyền trông giống như một nhiệm vụ dauning (yêu cầu các công cụ phát triển gia truyền, các tệp tiêu đề đã tuyệt chủng, trên mạng). Có thực sự đáng nỗ lực? Có những lựa chọn thay thế khác?
Christian Pietsch

5

Sắp xếp các đầu vào và báo cho diffchương trình, các đầu vào của nó được sắp xếp sẽ giúp tăng tốc độ lớn. Tôi không biết bất kỳ difftùy chọn nào như vậy nhưng commgiả sử đầu vào được sắp xếp và sẽ nhanh hơn nhiều nếu nó đủ cho mục đích của bạn.


commđã làm việc rất tốt cho việc này, chưa bao giờ nghe về nó trước đây nhưng rõ ràng nó nằm trong lõi.
theferrit32
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.