uniq в Linux — как удалять дубликаты строк

Вы когда-нибудь работали с текстовыми файлами, где строки повторяются, или получали вывод команд с дубликатами? Если нужно фильтровать повторяющиеся строки и получить только уникальные значения, команда uniq в Linux — один из самых простых и быстрых инструментов для этой задачи.
Что такое uniq
uniq — это команда для сравнения соседних строк в текстовом потоке и вывода только уникальных (или только повторяющихся) записей. Ключевая особенность: uniq обрабатывает соседние строки, поэтому для правильной работы с неотсортированными данными её обычно комбинируют с sort.
Определение в одну строку: uniq сравнивает только соседние строки и может подсчитывать или выводить повторяющиеся записи.
Важное замечание
- uniq по умолчанию чувствителен к регистру. Чтобы сравнения были нечувствительны к регистру, используйте опцию -i.
- Если строки не отсортированы, предварительно применяйте sort или логическую группировку по ключу.
Синтаксис и базовое использование
Базовый синтаксис:
uniq [опции] [входной_файл] [выходной_файл]- опции — флаги (например, -c, -d, -i и т. д.).
- входной_файл — файл для обработки. Если не указан, uniq читает stdin.
- выходной_файл — необязательный параметр; чаще используют перенаправление > или pipe.
Если нужно подать на вход результат сортировки, типичная конструкция:
sort file.txt | uniqили для записи результата в файл:
sort file.txt | uniq > unique.txtПример текстового файла
В примерах ниже используется файл duplicate.txt:
127.0.0.1 TCP
127.0.0.1 UDP
Do catch this
DO CATCH THIS
Don't match this
Don't catch this
This is a text file.
This is a text file.
THIS IS A TEXT FILE.
Unique lines are really rare. Предположим, этот файл уже отсортирован (для корректной работы uniq).
Если файл не отсортирован, выполните:
sort filename.txt > sorted.txtОсновные примеры и опции
Удаление подряд идущих дубликатов
uniq duplicate.txtОжидаемый результат: команда выведет первую из каждой группы одинаковых соседних строк и пропустит последующие повторы.
Подсчёт количества повторов
uniq -c duplicate.txtОпция -c выводит перед строкой число её подряд идущих повторений.
Печать только повторяющихся строк
uniq -D duplicate.txtОпция -D (Duplicate) выводит все строки, которые встречаются более одного раза, включая все их повторения.
Пример вывода:
This is a text file.
This is a text file.Пропуск полей при сравнении
Если строки состоят из полей (разделённых пробелами или табуляцией), можно пропустить N первых полей:
uniq -f 1 fields.txtПример файла fields.txt:
192.168.0.1 TCP
127.0.0.1 TCP
354.231.1.1 TCP
Linux FS
Windows FS
macOS FSКоманда пропускает первое поле и сравнивает остальные поля, поэтому выводит первую уникальную комбинацию по второму полю:
192.168.0.1 TCP
Linux FSПропуск символов при сравнении
Опция -s позволяет пропустить N первых символов в строке:
uniq -s 2 list.txtЭто удобно для нумерованных списков:
1. First
2. Second
3. Second
4. Second
5. Third
6. Third
7. Fourth
8. FifthСравнение только первых N символов
uniq -w 2 duplicate.txtОпция -w ограничивает сравнение первыми N символами строки.
Игнорирование регистра
uniq -i duplicate.txtОпция -i делает сравнение нечувствительным к регистру — DO CATCH THIS и Do catch this будут считаться одинаковыми.
Перенаправление вывода в файл
uniq -i duplicate.txt > otherfile.txt
cat otherfile.txtОбратите внимание: перенаправление подавляет вывод в терминале — результат попадает в целевой файл.
Когда uniq не подойдёт
- Если одинаковые строки распределены по файлу, но не стоят подряд, uniq без предварительного sort не удалит дубликаты.
- Для сложных шаблонных совпадений по части строки или регулярных выражений лучше подходят awk или sed.
- Когда нужно учитывать ключи в середине строки (множественные ключи), эффективнее использовать awk с ассоциативными массивами.
Альтернативные подходы
- sort -u file.txt — сортирует и убирает дубликаты (полезно, когда порядок не важен).
- awk ‘!seen[$0]++’ file.txt — сохраняет первый встретившийся вариант (сохраняет порядок без сортировки).
- awk -F” “ ‘!seen[$2]++’ — удаление по второму полю.
- sed ‘/^$/d’ — удалить пустые строки (подготовка данных).
- Perl и Python — для сложной логики и нечувствительных к регистру сравнений со сложными нормализациями.
Когда выбрать что:
- Сохранить порядок и удалить только последующие дубликаты: uniq (с предварительным sort, если нужно глобальное удаление).
- Удалить все повторы вне зависимости от порядка: sort -u.
- Сложные правила совпадения или нормализации: awk/Python/Perl.
Практический мини-метод для удаления дубликатов
- Оцените, важен ли исходный порядок строк. Если да — используйте awk.
- Если порядок не важен или нужна глобальная уникальность — sort -u.
- Если нужно сравнивать по части строки — используйте опции -f, -s или -w.
- Для нечувствительности к регистру применяйте -i.
- Всегда проверяйте результат перед перезаписью оригинального файла.
Пример рабочей последовательности:
cp data.txt data.backup
sort data.txt | uniq -c | sort -nr > duplicates_report.txt
sort data.txt | uniq > data.unique.txtЧеклист по ролям
Системный администратор:
- Сделать бэкап файла перед массовыми изменениями.
- Использовать sort | uniq для отчистки логов.
- Проверить влияние на скрипты, которые зависят от порядка строк.
Разработчик:
- Использовать awk для удаления дубликатов по ключу.
- Писать тесты на примерах входных данных.
Аналитик данных:
- Предварительно нормализовать строки (trim, lower) перед uniq.
- Проверить, не потеряются ли важные метаданные при агрегации.
Критерии приёмки
- После выполнения команды в результирующем файле не должно быть подряд повторяющихся строк (если цель — их удалить).
- При использовании опции -c сумма чисел перед строками должна равняться числу строк в исходном файле.
- Если был выполнен бэкап, оригинал остаётся доступным.
Короткий глоссарий
- stdin/stdout — стандартный ввод/вывод.
- поле — фрагмент строки, разделённый пробелом или табуляцией.
- нормализация — приведение строки к единому виду (trim, lower).
Полезные приёмы и хинты
- Для нечувствительности к пробелам и регистру: сначала нормализуйте через sed/awk:
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt | tr '[:upper:]' '[:lower:]' | sort | uniq- Чтобы сохранить порядок и убрать повторы (без сортировки):
awk '!seen[$0]++' file.txt > unique_preserve_order.txt- Быстрая отчётность по дубликатам:
sort file.txt | uniq -c | sort -nr | head -n 50Резюме
Команда uniq полезна для быстрого удаления подряд идущих дубликатов и подсчёта повторов. Для корректной глобальной дедупликации сочетайте её с sort. Для более сложных правил используйте awk или скрипты на языке высокого уровня.
Важно: всегда делайте резервную копию оригинальных данных перед массовыми преобразованиями.
Конец статьи.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone