команда 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должен отображаться, поскольку их хэши одинаковы. Я что-то пропустил? Может кто-нибудь просветить меня, почему это выводит, как это?

user2127726
источник
1
Догадаться. Очевидно, uniq не обнаруживает повторяющиеся строки, если они не являются смежными. Ссылка на ответ , который помог мне stackoverflow.com/questions/23114677/...
user2127726

Ответы:

49

Вы должны использовать sortперед uniq:

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

uniqудаляет только повторяющиеся строки Он не переупорядочивает строки в поисках повторов. sortделает эту часть.

Это задокументировано в man uniq:

Примечание: «uniq» не обнаруживает повторяющиеся строки, если они не являются смежными. Вы можете сначала отсортировать ввод или использовать sort -u' withoutuniq '.

John1024
источник
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чтобы определить, в какой части строки должны быть уникальными.

Например,

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

дает точно такой же результат, но sortчасть более гибкая для других целей.

Volker Siegel
источник