lệnh uniq không hoạt động đúng?


22

Vì vậy, tôi đang kiểm tra md5hàm băm của tệp với mục này là đầu ra của mình:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
657cf4512a77bf47c39a0482be8e41e0  ./dupes.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

Tuy nhiên, sau khi chạy find . -type f -exec md5sum '{}' ';' | uniq -w 33để tìm các giá trị băm độc đáo, tôi nhận được điều này:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

Theo hiểu biết của tôi, chỉ một trong hai derpina.txthoặc derp.txtnên được hiển thị vì băm của chúng là như nhau. Tui bỏ lỡ điều gì vậy? Bất cứ ai có thể khai sáng cho tôi tại sao nó xuất ra như thế này?


1
Tìm ra. Rõ ràng uniq không phát hiện các dòng lặp đi lặp lại trừ khi chúng liền kề nhau. Liên kết để trả lời giúp tôi stackoverflow.com/questions/23114677/ từ
user2127726

Câu trả lời:


48

Bạn cần sử dụng sorttrước uniq:

find . -type f -exec md5sum {} ';' | sort | uniq -w 33

uniqchỉ loại bỏ các dòng lặp đi lặp lại. Nó không sắp xếp lại các dòng tìm kiếm lặp lại. sortlàm phần đó

Điều này được ghi lại trong man uniq:

Lưu ý: 'uniq' không phát hiện các dòng lặp lại trừ khi chúng liền kề nhau. Bạn có thể muốn sắp xếp đầu vào trước hoặc sử dụng sort -u' withoutuniq '.


uniqnên được đặt bí danh như sort -umặc định trong tất cả các hệ thống. Nếu có thì nó luôn cần "sắp xếp" để nó hoạt động bình thường.
Devaroop

Sự thay đổi đó sẽ giảm bớt một số nhầm lẫn. Mặt khác, uniqcó nhiều tính năng không có sẵn sort -u. Ngoài ra, có những trường hợp một người muốn sử dụng uniqmà không có sort.
John1024

5

Đầu vào cho uniqnhu cầu được sắp xếp. Vì vậy, đối với trường hợp ví dụ,

find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33

sẽ làm việc Các -w( --check-chars=N) làm cho các dây chuyền độc đáo chỉ liên quan đến cột đầu tiên; Tùy chọn này hoạt động cho trường hợp này. nhưng khả năng chỉ định các phần có liên quan của dòng cho uniqbị hạn chế. Ví dụ, không có tùy chọn để chỉ định làm việc trên một số cột 3 và 5, bỏ qua cột 4.

Lệnh sortcó một tùy chọn cho chính các dòng đầu ra duy nhất và các dòng này là duy nhất liên quan đến các phím được sử dụng để sắp xếp. Điều này có nghĩa là chúng ta có thể sử dụng cú pháp khóa mạnh mẽ sortđể xác định phần nào các dòng nên là uniq.

Ví dụ

find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u

chỉ đưa ra kết quả tương tự, nhưng sortphần linh hoạt hơn cho các mục đích sử dụng khác.


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.