2009-10-14 5 views
37

Tôi cần làm việc với các tệp lớn và phải tìm sự khác biệt giữa hai tệp. Và tôi không cần các bit khác nhau, nhưng số lượng khác biệt.Làm thế nào để đếm sự khác biệt giữa hai tập tin trên Linux?

Để tìm số hàng khác nhau tôi đưa ra

diff --suppress-common-lines --speed-large-files -y File1 File2 | wc -l 

Và nó hoạt động, nhưng là có một cách tốt hơn để làm điều đó?

Và cách đếm số khác biệt chính xác (với các công cụ chuẩn như bash, diff, awk, sed một số phiên bản cũ của perl)?

Trả lời

31
diff -U 0 file1 file2 | grep -v ^@ | wc -l 

Điều đó trừ 2 cho hai tên tệp ở đầu danh sách diff. Định dạng hợp nhất có thể nhanh hơn một chút so với định dạng cạnh nhau.

+5

này không hoạt động, như tôi đã xác định "làm việc" http: // pastie. org/pastes/3179433/text Chỉ có một ký tự trong mỗi tệp, số "4" có liên quan đến gì? –

+0

Thao tác này hoạt động. Đối với ví dụ của bạn, bạn có bốn dòng: hai đầu tiên là tên của mỗi tệp (như được giải thích trong câu trả lời) và hai khác là hai sự khác biệt, 1 dòng có 'a' bị loại bỏ và 1 dòng có 'b' được thêm vào. –

+4

Nó phụ thuộc vào cách bạn tính sự khác biệt. Trong ví dụ này [pastie.org/5553254](http://pastie.org/5553254), tôi xem xét có 2 dòng khác nhau, tức là tôi đồng ý với mcdowell sequoia. Nó cũng là bất tiện để phải trừ 2 từ kết quả (do in ấn của 2 diff: ed tập tin). Vì vậy, tôi nghĩ câu trả lời của Josh là câu trả lời đúng. Nó có thể được rút ngắn một chút bằng cách sử dụng tùy chọn –c (count) trên grep, thay vì đường ống đến wc –l, như sau: 'diff -U 0 file1 file2 | grep -c^@ ' –

6

Nếu sử dụng Linux/Unix, điều gì về comm -1 file1 file2 để in các dòng trong tệp1 không có trong tệp 2, comm -1 file1 file2 | wc -l để đếm chúng và tương tự cho comm -2 ...?

+0

Như sureshw chỉ ra trong một câu trả lời khác, 'comm' mong đợi các đối số của nó là các tệp * được sắp xếp *. Vì vậy, đề xuất này chỉ có thể được dựa vào trong các trường hợp đặc biệt.(Tôi nghĩ sẽ dễ dàng để viết phiên bản 'comm' của riêng bạn bằng cách sử dụng awk làm việc cho đầu vào không được sắp xếp, nhưng nghi ngờ rằng điều này thỏa mãn tinh thần của câu hỏi ban đầu nữa.) – dubiousjim

40

Nếu bạn muốn đếm số dòng được sử dụng khác nhau này:

diff -U 0 file1 file2 | grep ^@ | wc -l 

Liệu câu trả lời không John đôi đếm các dòng khác nhau?

+0

Có, nó tăng gấp đôi. Xem nhận xét của tôi về câu trả lời được chấp nhận. Lệnh trong câu trả lời này là chính xác. –

+2

Điều này dường như cũng có khả năng đếm hai dòng với tôi, cả trên MacOSX và Ubuntu. Hàng loạt các đường liền nhau có thể được nhóm lại với nhau trong một khối duy nhất và nó phụ thuộc vào nhiệm vụ của bạn là liệu có nên là một sự khác biệt hay không. – khedron

+0

Đừng quên đầu ra màu có nghĩa là các dòng bắt đầu bằng một chuỗi thoát! Đã phải sử dụng hexdump để con số đó ra. –

4

Vì mỗi dòng đầu ra khác bắt đầu với < hoặc > nhân vật, tôi sẽ đề nghị này:

diff file1 file2 | grep ^[\>\<] | wc -l 

Bằng cách chỉ sử dụng \< hoặc \> trong dòng kịch bản bạn có thể đếm khác biệt duy nhất tại một trong các tập tin.

+0

Điều này đôi đếm các dòng là "<" and ">" có thể được in cho cùng một dòng . –

0

Nếu bạn đang xử lý các tệp có nội dung tương tự nên được sắp xếp cùng một dòng-cho-dòng (như tệp CSV mô tả những thứ tương tự) và bạn sẽ ví dụ: muốn tìm 2 sự khác biệt trong các tập tin sau đây:

File a: File b: 
min,max min,max 
1,5  2,5 
3,4  3,4 
-2,10  -1,1 

bạn có thể thực hiện nó bằng Python như thế này:

different_lines = 0 
with open(file1) as a, open(file2) as b: 
    for line in a: 
     other_line = b.readline() 
     if line != other_line: 
      different_lines += 1