uniq
Схлопнуть соседние одинаковые строки, посчитать повторы, найти дубли
uniq убирает соседние повторяющиеся строки. Поэтому почти всегда его ставят после sort: сортировка собирает одинаковые строки вместе, а uniq их схлопывает или считает.
Синтаксис
sort [файл] | uniq [опции]
uniq [опции] [вход [выход]]
Второй аргумент — файл вывода, а не ещё один вход.
Опции
Что выводить
| Опция | Что делает |
|---|---|
| (без опций) | по одной строке из каждой группы одинаковых соседних строк |
-c | перед строкой — сколько раз она повторилась подряд |
-d | только повторявшиеся строки, по одной на группу |
-D | только повторявшиеся строки, все экземпляры |
--all-repeated=separate | как -D, но группы разделены пустой строкой (prepend — пустая строка и перед первой группой) |
-u | только строки, которые не повторялись |
--group | все строки, группы разделены пустой строкой (=prepend, =append, =both — где ставить разделитель) |
Как сравнивать
| Опция | Что делает |
|---|---|
-i | без учёта регистра |
-f N | пропустить первые N полей (поле — пробелы и следующие за ними непробельные символы) |
-s N | пропустить первые N символов (после полей из -f) |
-w N | сравнивать не больше N символов |
-z | строки разделены нулевым байтом, а не \n |
Формат вывода -c
Счётчик выравнивается пробелами по ширине 7 символов, затем пробел и строка: 3 b. Если строки нужно разобрать дальше, бери awk (awk '{print $1}') — он не смущается ведущими пробелами.
Примеры
printf 'b\na\nb\nc\nb\n' > items.txt
# уникальные значения (то же, что sort -u)
sort items.txt | uniq
# частотный словарь: сколько раз встречается каждое значение
sort items.txt | uniq -c
# самые частые сверху, первые три
sort items.txt | uniq -c | sort -rn | head -n 3
# только значения, которые встречаются больше одного раза
sort items.txt | uniq -d
# все экземпляры повторов
sort items.txt | uniq -D
# только те, что встречаются ровно один раз
sort items.txt | uniq -u
# сравнивать без первого поля (например, без номера или времени в начале)
printf '1 x\n2 x\n3 y\n' | uniq -f1
# без учёта регистра
printf 'Apple\napple\nbanana\n' | uniq -i
# по первым 3 символам
printf 'abc-1\nabc-2\nxyz-1\n' | uniq -w3
# разбить отсортированный список на группы пустыми строками
printf 'a\na\nb\nc\nc\n' | uniq --group
Подводные камни
- Без сортировки дубли остаются.
uniqсравнивает строку только с предыдущей: вa b aобеaостанутся. Сначалаsort, потомuniq. uniq -cвыравнивает счётчик пробелами (2 a). Если дальше режешь вывод черезcut -d' ', поля съедут — бери awk илиsort -rn, которых пробелы в начале не смущают.- Пробелы в конце строки делают строки разными.
aиa(с пробелом) — разные строки. Убери их заранее, например через sed. uniqне видит столбцы. Чтобы найти дубли по одному полю, вырежи его сначала (cut, awk) или используй-f/-w. Для «первая строка на каждое значение поля» удобенawk '!seen[$1]++'.uniq a.txt b.txtперезапишетb.txt— второй аргумент это вывод.-fсчитает поля по пробелам и табуляциям, другого разделителя задать нельзя.- Порядок сортировки зависит от локали, но для
uniqэто неважно: главное, чтобы одинаковые строки оказались рядом. Важно только сортировать и сравнивать в одной локали, особенно сsort -fиuniq -i.