Вот команды для случайного файла из pastebin :
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
Страницы руководства не ясно о том, что -u
делает флаг. Любой совет?
Ответы:
Укороченная версия:
uniq
, без-u
, делает каждую строку вывода уникальной.uniq -u
печатает только каждую уникальную строку из ввода .Чуть более длинная версия:
uniq
предназначен для работы с файлами с дублированными строками, и только тогда, когда эти строки появляются последовательно во входных данных. Таким образом, для своих целей уникальная строка - это строка, которая не дублируется сразу.(
uniq
имеет очень ограниченную кратковременную память; он никогда не будет помнить, появилась ли ранее строка на входе, если это не была непосредственно предыдущая строка - вот почемуuniq
очень часто в паре сsort
.)Когда встречается повторяющиеся строки,
uniq
без-u
аргумента печатается одна копия этой строки. (Это делает каждую строку вывода уникальной ).С
-u
аргументом он печатает ноль копий этой строки - серии дубликатов просто исключаются из вывода.источник
sort -u
вместоsort | uniq
.uniq
выполняет нормализацию и сопоставление, да. Но даже тогда это только локальное соображение - вы знаете, где в отсортированном выводе появится строка, и вам просто нужно выбрать, какую из нескольких соседних строк сохранить. Если входные данные не отсортированы, то решение влияет на всю операцию uniqifying, например, если вы собираетесь сохранить последний дубликат, вы ничего не сможете вывести, пока не прочитаете последнюю строку ввода ...uniq
с-u
пропускает любые строки, которые имеют дубликаты. Таким образом:Обычно
uniq
печатает строки не более одного раза (при условии отсортированного ввода). Эта опция на самом деле печатает строки, которые действительно уникальны (не появившись снова).источник
uniq
может быть вызванdistinct
, поскольку он печатает все отдельные строки, тогда какuniq -u
печатает все уникальные строки.uniq
в некоторых локалях.Спецификация uniq POSIX описала это ясно:
-u
опция makeuniq
не печатать повторяющиеся строки.В большинстве
uniq
реализаций использовалось сравнение байтов, а в GNUuniq
использовался порядок сортировки для фильтрации дублированных строк. Таким образом, он может давать неправильный результат в некоторых локалях, например вen_US.UTF-8
локали:и не
-u
дал вам никаких строк:Таким образом, вы должны установить locale
C
для получения байтового сравнения:источник
uniq
(хотя очевидно, что цель POSIX состояла в том, чтобы он выполнял сравнение байтов вместо strcoll (), как вsort -u
), в отличие от тех локалей, которые ошибочно имеют «сортировку, такую же как». По крайней мере, GNUuniq
соответствуетsort -u
.uniq
требуется сделать memcmp / strcmp, а не strcoll, для меня это не очень очевидно, но для Джеффа . Для локалей GNU, имеющих «сортировку так же, как», это явно ошибка, поскольку нет причины, по которой они должны сортировать то же самое. Это разрешено POSIX, но есть некоторые изменения .обычный:
uniq: нет двух последовательных повторяющихся строк
отсортированный
sort -u: нет двух повторяющихся строк
сортировка / уникальность: все различно
считает различные случаи
только строки, которые не повторяются (не отсортированы первыми)
только строки, которые не повторяются (после сортировки)
uniq -d: печатать только повторяющиеся строки, по одной для каждой группы
.. посчитал
источник