Перейти к основному содержанию

Linux — удалить дубликаты строк в файле

Linux

Напоминалка. Если нам нужно удалить из файла дубликаты строк, то нельзя использовать операторы перенаправления ">" или ">>". Такие операторы имеют более высокий приоритет и начинают писать в файл ещё до того, как полностью считали из него же все строки.

Ну, как нельзя, можно, если использовать промежуточный файл, но это некрасиво.

На помощь приходят инструменты: tee, sponge (из пакета moreutils), sed -i, awk и другие инструменты записи в файл.

Сортировка и поиск дубликатов

Давайте сначала разберём пару способов поиска дубликатов строк.

Если у нас строки в файле уже отсортированы, то вычистить дубликаты можно командой uniq. Имеем файл test.txt:

Ася
Боря
Коля
Коля
Олег

Выполняем:

cat test.txt | uniq

или

uniq test.txt

Результат:

Ася
Боря
Коля
Олег

Если у нас строки в файле не отсортированы, то нужно сортировать, например с sort. Имеем файл test.txt:

Ася
Коля
Боря
Олег
Коля

Выполняем:

cat test.txt | sort | uniq

или

sort test.txt | uniq

или

sort -u test.txt

Результат:

Ася
Боря
Коля
Олег

С сортировкой и вычищением дубликатов разобрались.

Запись результата в тот же файл

А теперь самое интересное. Нам нужно сохранить результат в тот же самый файл. Операторы перенаправления можно использовать в данном случае только с промежуточным файлом, например:

sort -u test.txt > test.tmp
mv -f test.tmp test.txt

или одной строкой

sort -u test.txt > test.tmp; mv -f test.tmp test.txt

Можно использовать губку sponge, которая накапливает весь вывод перед вводом:

apt-get install moreutils
sort -u test.txt | sponge test.txt

Можно использовать тройник tee:

sort -u test.txt | tee test.txt

или без вывода на экран

sort -u test.txt | tee test.txt >/dev/null

И самый, на мой взгляд, оптимальный метод вывода в файл без перенаправления:

sort -u test.txt -o test.txt

Вывод дубликатов

Если задача состоит в том, чтобы вывести на экран из файла только те строки, которые имеют дубли, то сначала сортируем строки с помощью sort, потом отображаем только неуникальные значения с помощью uniq с атрибутом -d:

sort file1.txt | uniq -d

linux

Теги

 

Похожие материалы

Обновление vCenter 7.0.3.02200

18 октября 2024 года для vCenter 7 вышло обновление 7.0.3.02200. Ссылка на страницу с описанием релиза ведёт на сайт Broadcom в статье базы знаний, по причине того, что основной сайт в разработке.

mdadm — расширяем RAID1 массив

Недавно в RAID1 массиве вышел из строя диск. Так сильно переклинило, что невозможно было даже в BIOS зайти. Перепрошивка BIOS не помогла, обновление iLO не помогло, настройки электропитания через iLO не помогли.

Теги