2013-03-18 28 views
10

Từ thiết bị đầu cuối unix, chúng ta có thể sử dụng diff file1 file2 để tìm sự khác biệt giữa hai tệp. Có một lệnh tương tự để hiển thị sự giống nhau trên 2 tệp không? (Nhiều ống phép nếu cần thiếtCách tìm các dòng trùng lặp trên 2 tệp khác nhau? Unix

Mỗi tập tin chứa một phù hợp với một câu chuỗi, họ đều được sắp xếp và lặp lại dòng loại bỏ bằng sort file1 | uniq

file1:.. http://pastebin.com/taRcegVn

file2: http://pastebin.com/2fXeMrHQ

Và đầu ra sẽ xuất ra các dòng xuất hiện trong cả hai tệp.

output: http://pastebin.com/FnjXFshs

tôi có thể sử dụng python để làm điều đó như thế nhưng tôi nghĩ rằng đó là một chút quá nhiều để đưa vào thiết bị đầu cuối:

x = set([i.strip() for i in open('wn-rb.dic')]) 
y = set([i.strip() for i in open('wn-s.dic')]) 
z = x.intersection(y) 
outfile = open('reverse-diff.out') 
for i in z: 
    print>>outfile, i 
+0

làm tập tin của bạn như thế nào? – paulmelnikow

+3

có thể trùng lặp của [cách hiển thị các dòng chung (đảo ngược khác nhau)?] (Http://stackoverflow.com/questions/746458/how-to-show-lines-in-common-reverse-diff) – tjameson

+0

Hầu hết các lần chuỗi câu ngôn ngữ của con người. Đôi khi được cột với nhiều thông tin hơn. – alvas

Trả lời

9

Như @tjameson đề cập đến nó có thể được giải quyết trong thread khác. Chỉ muốn gửi một giải pháp: sort file1 file2 | awk 'dup[$0]++ == 1'

  1. tham khảo awk guide để có được một số awk điều cơ bản, khi giá trị mô hình của một dòng là đúng dòng này sẽ được in

  2. dup [ $ 0] là một bảng băm trong đó mỗi khóa là mỗi dòng của đầu vào, giá trị ban đầu là 0 và gia số khi dòng này xảy ra, khi nó xảy ra một lần nữa giá trị phải là 1, vì vậy dup[$0]++ == 1 là đúng. Sau đó, dòng này được in.

Lưu ý rằng điều này chỉ hoạt động khi không có trùng lặp trong một trong hai tệp, như được chỉ định trong câu hỏi.

+0

Bạn có thể giải thích cách 'awk' dup [$ 0] ++ == 1'' hoạt động không?Giải pháp của bạn tốt hơn nhiều so với câu lệnh 'comm' – alvas

+0

@ 2er0 gây nhầm lẫn được cập nhật –

+1

' awk' sử dụng ký pháp 'pattern {action}'. Vì đây không phải là trong niềng răng, nó là một khuôn mẫu. '$ 0' là dòng hiện tại. 'dup [$ 0]' là một mảng liên kết được lập chỉ mục bởi các dòng; khi được tạo lần đầu, giá trị là 0; 'dup [$ 0] ++' post-increments giá trị, vì vậy nó trả về 0 lần đầu tiên, và 1 vào lần thứ hai, vv. Khi giá trị của nó là 1, điều kiện là đúng để hành động mặc định (in dòng) được thực hiện. –

24

Nếu bạn muốn có được một danh sách các dòng lặp đi lặp lại mà không cần đến AWK, bạn có thể sử dụng -d flag to uniq:

sort file1 file2 | uniq -d 
+1

Để sử dụng công cụ đơn giản nhất để đạt được mục tiêu. –

+0

Ngoài ra, thả các -d được bạn chỉ là tất cả các dòng riêng biệt từ cả hai tập tin đó là những gì tôi đang tìm kiếm. – Aaron