2576 subscribers

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

Источник:
https://internet-lab.ru/linux_uniq_sort

💰 Поддержать проект

Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.