2012-01-04 28 views
5

Tôi có 2 tệp nix. Tất cả dữ liệu nằm trên một dòng duy nhất trong mỗi tệp. Mỗi giá trị được phân tách bằng một ký tự null. Một số tắt giá trị trong khớp dữ liệu.So sánh 2 tập tin Unix và kết nối đầu ra với một tập tin mới?

Làm cách nào để phân tích cú pháp dữ liệu này thành một tệp mới chỉ liệt kê các giá trị khớp?

Tôi có thể sử dụng sed để thay đổi các ký tự null thành dòng mới không? Từ đó tôi không thực sự chắc chắn ...

Bất kỳ ý tưởng nào?

+4

Có lặp lại giá trị trong một tập tin duy nhất? Một số dữ liệu mẫu sẽ giúp ích. –

+1

sẽ định vị bất kỳ sự khác biệt nào hoặc bạn chỉ đang tìm kiếm sự tồn tại phù hợp tại bất kỳ điểm nào trong tệp? như @JohnZwinck đã nói, dữ liệu mẫu sẽ giúp ích. – Radix

+0

Vị trí không có sự khác biệt, có thể có giá trị trùng lặp. – rreeves

Trả lời

12

Sử dụng tr, sortcomm:

Chuyển đổi null vào dòng mới và sắp xếp các kết quả:

$ tr '\000' '\n' < file1 | sort > file1.txt 
$ tr '\000' '\n' < file2 | sort > file2.txt 

sau đó sử dụng comm để có được những dòng đó là chung cho cả tập tin:

$ comm -1 -2 file1.txt file2.txt 
<lines shown here are the common lines between file1.txt and file2.txt> 
5

Nếu không có giá trị trùng lặp trong tệp1 hoặc tệp2, bạn có thể thực hiện việc này:

(tr '\0' '\n' < file1; tr '\0' '\n' < file2) | sort | uniq -c | egrep -v '^ +1' 

Điều này sẽ tính tất cả các giá trị trùng lặp giữa hai tệp.

Nếu thứ tự của các lĩnh vực rất quan trọng, bạn có thể làm điều này:

comm -1 -2 <(tr '\0' '\n' < file1) <(tr '\0' '\n' < file2) 

Cách tiếp cận này không phải là di động, nó đòi hỏi của quá trình thay thế 'tính năng của Bash.

1

Điều này có thể làm việc cho bạn:

parallel 'tr "\000" "\n" <{} | sort -u' ::: file{1,2} | sort | uniq -d 
Các vấn đề liên quan