Команда 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за замовчуванням у всіх системах. Якщо взагалі його завжди потрібно «сортувати», щоб воно працювало належним чином.
Деварооп

Ця зміна призведе до зменшення плутанини. З іншого боку, 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деталь є більш гнучкою для інших цілей.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.