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

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

Теги

 

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

HP Proliant DL580 Gen9 — установка памяти

В сервер HP Proliant DL580 Gen9 можно установить до 96 планок памяти DIMM. Девяносто шесть, Карл! Можно установить восемь картриджей памяти, каждый из которых содержит 12 слотов для DIMM.

Теги

SPP Service Pack for ProLiant — version 2020.09.1

Для обновления прошивок серверов HPE ProLiant Gen9 и Gen10 вышел новый сервис пак — SPP 2020.09.1 от 8 апреля 2021 г. Релиз содержит важное исправление для NVME дисков и исправления безопасности CVE-2020-10713, CVE-2020-15705 и CVE-2020-7205

Теги