Перейти к содержимому

Удалить повторяющиеся строки

Наведите порядок в списке: уберите повторы, правильно отсортируйте, удалите пустые строки. Инструмент покажет, какие строки повторялись и сколько раз, а не станет молча сокращать ваш список.

  • Не сохраняется
  • Без очереди и ожидания
  • Без регистрации и водяных знаков
Сортировка
Порядок
Результат

Здесь появится результат: Результат.

Как это работает

1

Вставьте список

Адреса почты, URL, коды товаров — что угодно, по одному на строку. Или перетащите текстовый файл.

2

Решите, что значит «одинаковые»

Не учитывайте пробелы в конце и регистр, оставьте первую или последнюю копию — или удалите все строки, у которых вообще были дубликаты.

3

Отсортируйте и приведите в порядок

Естественная сортировка, обратный порядок, перемешивание, нумерация строк или удаление пустых — затем скопируйте результат.

Что происходит со строками, которые остаются

На этой странице есть два разных вида обработки пробелов, и их стоит не путать. Обрезка для сравнения строит ключ и никогда не правит ваши строки — оставшаяся копия сохраняет исходные пробелы в точности. Параметры очистки делают противоположное: удаление отступов, сжатие серий пробелов и табуляций и обрезка концов строк — это настоящие правки, и выполняются они до удаления дубликатов, поэтому включение любого из них незаметно меняет и то, что считается дубликатом, и то, как выглядят строки.

Пустая строка сравнивается как любая другая, а значит, все пустые строки после первой исчезают вместе с остальными дубликатами — список с отступами между абзацами вернётся с одной пустой строкой на месте первой. А в отчёте о повторах показывается ключ, а не ваша строка: с обрезанными пробелами и в нижнем регистре, если вы попросили не учитывать регистр. Поэтому запись, которая встречается в списке и как Smith, и как SMITH, попадёт в отчёт один раз, строчными буквами, с количеством два. Этот список ограничен пятьюдесятью самыми частыми.

Что бы ни было на входе, на выходе строки соединяются только символами перевода строки, так что список, вставленный из файла Windows, по пути теряет символы возврата каретки — обычно это то, что нужно, но об этом стоит помнить, если результат вставляется туда, где это важно. Ещё один побочный эффект: включение «Не учитывать регистр» меняет не только сравнение, но и сортировку, и тогда сортировка перестаёт различать буквы с диакритикой и без, так что resume и résumé оказываются рядом, а не порознь.

Если нужно другое

Когда список на самом деле — таблица, построчное сравнение не подходит по своей сути. CSV, где «дубликат» означает совпадение двух строк по одному столбцу, — это вопрос не о строках текста, и если так к нему относиться, дубликаты либо пропустятся, либо удалятся строки, которые лишь казались похожими. Встроенная функция «Удалить дубликаты» в табличном редакторе делает это правильно для уже открытого файла, а mlr uniq -g делает то же в командной строке — с указанием решающего поля и на любом объёме.

Для списка, который не помещается во вкладку, или такого, который вы будете чистить снова через неделю, в командной строке хватит одного потокового выражения: awk '!seen[$0]++' оставляет первую копию и исходный порядок — ровно то, что эта страница делает по умолчанию, — на файле больше вашей памяти. Обрезки пробелов, учёта регистра и отчёта о повторах там нет — это и есть компромисс, и для файла в десять миллионов строк он правильный.

Частые вопросы

Мой список где-нибудь сохраняется?

Нет. Ничего не сохраняется, никакие запросы не отправляются. После загрузки страницы можно отключиться от интернета — всё продолжит работать.

Почему после удаления дубликаты всё ещё остались?

Почти всегда из-за пробелов в конце строк. Две строки, которые заканчиваются разным числом пробелов, на экране выглядят одинаково, но таковыми не являются, поэтому точное сравнение оставляет обе — и вы решаете, что инструмент сломан. Поэтому обрезка пробелов перед сравнением здесь по умолчанию ВКЛЮЧЕНА. Важно, что она влияет только на СРАВНЕНИЕ: оставшаяся строка сохраняет исходный текст, потому что незаметно править ваши строки — не то, что означает «удалить дубликаты».

Какая копия остаётся?

По умолчанию первая, а порядок остальных не меняется — это важно, если список уже упорядочен осмысленно. Можно оставить последнюю или удалить все строки, у которых были дубликаты, — тогда останутся только строки, встретившиеся ровно один раз. Так и находят записи, которые есть только в одном списке.

Почему при сортировке item10 оказывается перед item2?

Это обычная алфавитная сортировка: «1» идёт раньше «2», и до остальной части числа дело не доходит. Включите естественный порядок — и последовательности цифр будут сравниваться как числа, так что item2 окажется перед item10, как и ожидает человек. Текст с диакритикой тоже обрабатывается правильно: простое сравнение ставит «Zürich» после «Zyzzyva», потому что сравнивает коды символов, а не буквы.

Показывает ли он, что было удалено?

Да — строки, встретившиеся больше одного раза, перечислены с количеством, начиная с самых частых. Знать, КАКАЯ запись встретилась четыре раза, обычно полезнее, чем знать, что исчезли три строки.

Перемешивание действительно случайное?

Да. Используется алгоритм Фишера — Йетса с криптографическим источником случайности браузера. Распространённый приём — сортировка со случайной функцией сравнения — вообще не является перемешиванием: алгоритмы сортировки рассчитывают на согласованное сравнение, и со случайным результат заметно смещён в сторону исходного порядка. Если вы выбираете победителя из списка, эта разница важна.

Есть ли ограничение размера?

Ограничивает доступная память, а не фиксированный размер. Списки в сотни тысяч строк обрабатываются без проблем.

Полезно знать: Сортировка использует языковые правила вашего браузера, поэтому буквы с диакритикой и разные алфавиты упорядочиваются так, как ожидает читатель, а не по значению байтов. Это же значит, что порядок может немного отличаться в разных браузерах. Очень большие списки целиком хранятся в памяти.

Разместите этот инструмент на своём сайте

Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.