Удаление повторяющихся строк из текстового файла — распространенная задача в скриптах Bash. В этой статье рассматриваются два эффективных метода: использование sort
и uniq
, а также использование возможностей awk
.
Оглавление
Использование sort
и uniq
Этот подход объединяет две основные утилиты Unix для простого решения. sort
упорядочивает строки в алфавитном порядке, что является необходимым условием для uniq
, который затем удаляет повторяющиеся строки, идущие подряд. Порядок *первого* вхождения каждой строки сохраняется.
Вот команда:
sort file.txt | uniq > file_unique.txt
Эта команда передает отсортированный вывод file.txt
в uniq
, сохраняя уникальные строки в file_unique.txt
. Исходный файл остается неизменным.
Пример:
Если file.txt
содержит:
apple
banana
apple
orange
banana
grape
file_unique.txt
будет содержать:
apple
banana
grape
orange
Использование команды awk
awk
предлагает более гибкое и мощное решение, особенно полезное, когда важно сохранить исходный порядок строк. Он использует ассоциативный массив для отслеживания встреченных строк.
Команда удивительно кратка:
awk '!seen[$0]++' file.txt > file_unique.txt
Разберем подробнее:
$0
представляет всю текущую строку.seen[$0]
обращается к элементу в массивеseen
, используя строку в качестве ключа.++
выполняет пост-инкремент значения (начальное значение 0).!
инвертирует результат; строка выводится только если она встречена впервые (когдаseen[$0]
равно 0).
Этот метод сохраняет исходный порядок строк.
Пример:
Используя тот же file.txt
, вывод в file_unique.txt
будет:
apple
banana
orange
grape
Заключение:
Оба метода эффективно удаляют повторяющиеся строки. sort | uniq
проще для базовых сценариев, в то время как awk
обеспечивает большую гибкость и контроль, особенно для сохранения исходного порядка или обработки более сложных задач по удалению дубликатов.