← Весь справочник

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.

См. также

sort · wc · awk · datamash