Как использовать uniq в Linux — полное руководство

Что делает команда uniq
Команда uniq сравнивает соседние строки и выводит только уникальные по положению строки. Она не ищет дубликаты по всему файлу, поэтому для глобального удаления копий сначала применяют сортировку командой sort. uniq также умеет считать повторы, игнорировать регистр и пропускать поля или символы при сравнении.
Определение в одну строку: команда uniq удаляет или отмечает подряд идущие одинаковые строки в потоке текста.
Важно: uniq работает только с соседними строками. Если одинаковые строки не идут подряд, сначала выполните sort или используйте другие инструменты.
Базовый синтаксис
uniq [опции] [входной_файл] [выходной_файл]- опции — флаги управления поведением команды
- входной_файл — файл для обработки; если не указан, uniq читает stdin
- выходной_файл — необязателен; можно перенаправить вывод через > или использовать конвейеры
Примеры ниже используют обычный shell и стандартные утилиты GNU coreutils. Если у вас другая реализация (например, BusyBox), набор опций может отличаться.
Пример входного файла
Файл 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.Если вход не отсортирован, сначала выполните:
sort filename.txt > sorted.txtили используйте конвейер: sort filename.txt | uniq
Удаление повторяющихся строк
Вывод только уникальных по соседству строк:
uniq duplicate.txtВывод не изменяет исходный файл. Чтобы сохранить результат, перенаправьте вывод:
uniq duplicate.txt > unique.txtИли в конвейере:
sort duplicate.txt | uniq > unique_sorted.txtПодсчёт повторов
Флаг -c показывает количество подряд идущих одинаковых строк:
uniq -c duplicate.txtЭтот вывод полезен для подсчёта агрегированных значений после сортировки.
Показать только повторяющиеся строки
Флаг -D выводит все строки, которые имеют повтор (включая каждую из повторяющихся копий). Это удобно для инспекции дубликатов перед их удалением:
uniq -D duplicate.txtПример вывода:
This is a text file.
This is a text file.Пропустить поля при сравнении
Флаг -f N пропускает N полей (разделённых пробелами или табуляцией) при сравнении строк. Пример файла fields.txt:
192.168.0.1 TCP
127.0.0.1 TCP
354.231.1.1 TCP
Linux FS
Windows FS
macOS FSКоманда, которая игнорирует первое поле:
uniq -f 1 fields.txtРезультат выведет первые строки для каждого уникального значения второго поля.
Пропустить символы при сравнении
Флаг -s N пропускает N символов (от начала строки) при сравнении. Это полезно для нумерованных списков:
1. First
2. Second
3. Second
4. Second
5. Third
6. Third
7. Fourth
8. Fifthuniq -s 2 list.txtСравнивать только первые N символов
Флаг -w N ограничивает сравнение первыми N символами строки:
uniq -w 2 duplicate.txtИгнорировать регистр
Флаг -i делает сравнение нечувствительным к регистру:
uniq -i duplicate.txtЗаметьте: при использовании -i строки “DO CATCH THIS” и “Do catch this” будут считаться одинаковыми.
Отправить вывод в файл
Перенаправление стандартно:
uniq -i duplicate.txt > otherfile.txt
cat otherfile.txtЕсли нужен атомарный перезапись исходного файла, используйте sponge (от moreutils) или временный файл:
sort duplicate.txt | uniq > tmp && mv tmp duplicate.txt
# или
sort duplicate.txt | uniq | sponge duplicate.txtВажно: непосредственная запись через > на тот же файл, который читает команда, приведёт к потере данных.
Альтернативные подходы
- sed: можно удалить дубликаты с помощью sed-скрипта, особенно если порядок важен и нужно сохранять первую встречу строки.
- awk: гибкий инструмент для подсчёта, фильтрации и вывода уникальных строк без сортировки; позволяет хранить 상태 в ассоциативном массиве.
- sort -u: когда вам нужны уникальные строки по всему файлу и порядок не важен, sort -u быстрее и короче.
Примеры:
Удаление дубликатов без сортировки, сохранив первую встречу, с awk:
awk '!seen[$0]++' file.txt > unique_preserve_order.txtУдаление дубликатов по ключевому полю с awk (например, второе поле):
awk '!seen[$2]++' file.txtИспользование sort -u:
sort -u file.txt > unique.txtКогда awk лучше: если нужно сохранить исходный порядок строк и удалять повторные появления в любом месте файла.
Типичные ошибки и когда uniq не сработает
- Неотсортированный вход: uniq не обнаружит дубликаты, если одинаковые строки не идут подряд.
- Различия в пробелах или невидимых символах: строки с разными пробелами считаются разными.
- Кодировки: различие кодировок или невидимые символы (UTF-8 BOM) могут мешать совпадениям.
Проверяйте файл через od -c или cat -A, если поведение неожиданное.
Методология работы с дубликатами — краткий чеклист
- Оцените, надо ли сохранять исходный порядок.
- Если порядок не важен — используйте sort -u.
- Если порядок важен — используйте awk ‘!seen[$0]++’ или sort с ключом и последующим восстановлением порядка.
- Перед массовыми правками создайте резервную копию файла.
- Тестируйте на небольшом образце.
Справочная таблица по опциям
| Опция | Что делает | Пример |
|---|---|---|
| -c | Показать количество подряд идущих повторов | uniq -c file.txt |
| -d | Вывести только повторяющиеся строки | uniq -d file.txt |
| -D | Вывести все копии повторяющихся строк | uniq -D file.txt |
| -i | Игнорировать регистр | uniq -i file.txt |
| -f N | Пропустить N полей перед сравнением | uniq -f 1 file.txt |
| -s N | Пропустить N символов перед сравнением | uniq -s 2 file.txt |
| -w N | Сравнивать только первые N символов | uniq -w 5 file.txt |
Шпаргалка для разных ролей
- Системный администратор:
- Часто сортируйте вывод конфигураций и используйтe uniq -c для поиска повторов в списках. Создавайте резервные копии.
- Разработчик:
- Для логов применяйте awk и uniq совместно, чтобы аггрегировать и подсчитать события.
- Аналитик данных:
- Используйте sort -u для очистки набора данных перед загрузкой. Для сохранения порядка применяйте awk.
Критерии приёмки
- Входной файл обработан без потери нужных данных.
- Дубликаты удалены в соответствии с требованием (по всему файлу или только соседние).
- Проверены кейсы с регистром и пробелами.
Мини-методология очистки файла от дубликатов
- Сделать резервную копию: cp file.txt file.txt.bak
- Протестировать на части файла: head -n 200 file.txt | sort | uniq -c
- Выполнить полную обработку: sort file.txt | uniq > file.clean.txt
- Сравнить: diff file.txt.bak file.clean.txt или проверить контрольные суммы
- Подменить файл, если результат соответствует ожиданиям
Краткий глоссарий
- поле — фрагмент строки, разделённый пробелом или табуляцией
- соседние строки — строки, идущие подряд в файле
- stdin/stdout — стандартный ввод и вывод
Примеры тестов и критерии приёмки
- Тест 1: Файл с повторяющимися строками подряд. Ожидается, что uniq удалит все подряд идущие дубликаты.
- Тест 2: Файл с одинаковыми строками, не подряд. Ожидается, что uniq без сортировки ничего не изменит.
- Тест 3: Файл с различиями в регистре. Ожидается, что uniq -i сочтёт такие строки одинаковыми.
Часто задаваемые вопросы
Когда лучше использовать awk вместо uniq?
Если нужно сохранять исходный порядок и удалять все повторные вхождения по всему файлу, используйте awk: awk ‘!seen[$0]++’ file.txt. uniq работает только с соседними строками.
Можно ли исправить файл на месте?
Непрямое исправление на месте безопаснее: используйте временный файл и mv, либо sponge для атомарной перезаписи.
Что делать с невидимыми символами?
Проверяйте файл через cat -A или od -c, удаляйте лишние пробелы с помощью sed ‘s/[ \t]*$//‘ или iconv для проблем кодировок.
Важно: всегда делайте резервную копию перед массовыми правками.
Итог
uniq — простой и быстрый инструмент для работы с подряд идущими дублирующими строками. В связке с sort и awk он покрывает большинство задач по очистке текстовых данных. Выбирайте инструмент по задаче: sort -u для глобальной дедупликации, awk для сохранения порядка, uniq для простых случаев и подсчёта повторов.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента