คำสั่ง uniq ทำงานไม่ถูกต้องหรือไม่


22

ดังนั้นฉันจะตรวจสอบmd5แฮชของไฟล์ของฉันด้วยสิ่งนี้เป็นผลลัพธ์ของฉัน:

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

อย่างไรก็ตามหลังจากวิ่งfind . -type f -exec md5sum '{}' ';' | uniq -w 33ไปหาแฮชที่เป็นเอกลักษณ์ฉันได้รับสิ่งนี้:

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

จากความเข้าใจของฉันมีเพียงหนึ่งอย่างใดอย่างหนึ่งderpina.txtหรือderp.txtควรจะปรากฏขึ้นเนื่องจากแฮชของพวกเขาเหมือนกัน ฉันพลาดอะไรไปรึเปล่า? ใครสามารถบอกฉันได้ว่าทำไมมันถึงออกมาเป็นแบบนี้?


1
คิดออก เห็นได้ชัดว่า uniq ตรวจไม่พบบรรทัดที่ซ้ำกันเว้นแต่ว่าอยู่ติดกัน ลิงก์ไปยังคำตอบที่ช่วยฉันstackoverflow.com/questions/23114677/…
user2127726

คำตอบ:


48

คุณต้องใช้sortก่อนuniq:

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

uniqลบบรรทัดที่ทำซ้ำเท่านั้น มันไม่ได้เรียงลำดับบรรทัดที่ค้นหาการทำซ้ำ sortทำส่วนนั้น

เอกสารนี้มีไว้ในman uniq:

หมายเหตุ: 'uniq' ตรวจไม่พบบรรทัดที่ซ้ำกันยกเว้นว่าอยู่ติดกัน คุณอาจต้องการเรียงลำดับอินพุตก่อนหรือใช้sort -u' withoutuniq '


uniqควรมีนามแฝงเป็นsort -uค่าเริ่มต้นในทุกระบบ หากทุกอย่างจำเป็นต้องมี "การจัดเรียง" เพื่อให้สามารถทำงานได้อย่างถูกต้อง
Devaroop

การเปลี่ยนแปลงนั้นจะช่วยลดความสับสน บนมืออื่น ๆ ที่มีคุณสมบัติหลายอย่างไม่สามารถใช้ได้กับuniq sort -uนอกจากนี้ยังมีกรณีที่หนึ่งต้องการที่จะใช้โดยไม่ต้องuniq sort
John1024

5

อินพุตสำหรับuniqจำเป็นต้องเรียงลำดับ ดังนั้นสำหรับกรณีตัวอย่าง

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

จะทำงาน. -w( --check-chars=N) ทำให้เส้นที่เป็นเอกลักษณ์เฉพาะที่เกี่ยวกับคอลัมน์แรก; ตัวเลือกนี้ใช้ได้กับกรณีนี้ แต่ความเป็นไปได้ที่จะระบุส่วนที่เกี่ยวข้องของบรรทัดuniqนั้นมี จำกัด ตัวอย่างเช่นไม่มีตัวเลือกในการระบุการทำงานในบางคอลัมน์ 3 และ 5 โดยไม่สนใจคอลัมน์ 4

คำสั่งsortมีตัวเลือกสำหรับบรรทัดเอาต์พุตที่ไม่ซ้ำกันและบรรทัดนั้นไม่ซ้ำกันเกี่ยวกับคีย์ที่ใช้สำหรับการเรียงลำดับ ซึ่งหมายความว่าเราสามารถใช้ประโยชน์จากซินแท็กซ์คีย์ที่มีประสิทธิภาพของsortการกำหนดเกี่ยวกับส่วนที่บรรทัดควรจะ uniq

ตัวอย่างเช่น

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

ให้ผลลัพธ์เดียวกัน แต่sortส่วนนั้นยืดหยุ่นกว่าสำหรับการใช้งานอื่น ๆ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.