belun.app Блог
EN

Как отсортировать строки текста онлайн (и почему 10 идёт перед 9)

Практическое руководство по сортировке списков в браузере: алфавит, числа и длина строки, плюс дубликаты, которые пропускает uniq.

Распечатанный список на планшете рядом с ноутбуком — сортировка строк текста по алфавиту

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

Этим Сортировка строк текста и занимается.

Проблема «10 перед 9»

На этом спотыкаются почти все с первого раза. Отсортируйте по алфавиту три строки:

пункт 9
пункт 10
пункт 2

Получится пункт 10, пункт 2, пункт 9. Это не ошибка. Алфавитная сортировка сравнивает посимвольно, а «1» стоит раньше «2» и «9» в любой таблице символов. Она вообще не видит числа десять. Она видит символ «1», потом «0».

Числовой режим это чинит: вытаскивает из строки первое число и сравнивает значения, а не символы. Строки без чисел уходят вниз — обычно там им и место, вместе со случайными заголовками и недописанными записями.

Удаление дубликатов и почему uniq вас обманывает

Если вы когда-нибудь запускали в терминале вот это и не понимали, почему дубликаты выжили:

uniq contacts.txt

uniq схлопывает только те одинаковые строки, которые стоят рядом. Две одинаковые записи на расстоянии четырёхсот строк он просто не замечает. Нужно sort contacts.txt | uniq или, короче, sort -u contacts.txt.

У галочки «Удалить дубликаты» такой ловушки нет. Она просматривает весь список, оставляет первое вхождение каждой строки и показывает, сколько выкинула. Регистр по умолчанию не учитывается, поэтому «Яблоко» и «яблоко» схлопнутся в одну запись. Если для ваших данных это неверно, отметьте «Учитывать регистр».

Сортировка по длине

Самый неочевидный режим, и пользуюсь я им чаще, чем ожидал. Он хорош, когда надо:

  • найти выброс: единственную подозрительно длинную ссылку в карте редиректов;
  • заметить обрезанные записи, они соберутся сверху;
  • глазами проверить список идентификаторов на те, что не совпадают с ожидаемым форматом.

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

Локали, о которых обычно молчат

Сортировка не универсальна. Запустите LC_ALL=C sort на юникс-машине, и сравнение пойдёт по байтам: все заглавные окажутся впереди всех строчных, а буквы с диакритикой улетят куда-то за Z. Отсюда и «Zebra» перед «apple».

Здесь работает локале-зависимое сравнение браузера. «Å» встаёт рядом с «A», «Ё» — рядом с «Е». Заглавные и строчные чередуются так, как разложил бы их человек, а не побайтовое сравнение.

Ничего не уходит из браузера

Сортировка работает на JavaScript, прямо во вкладке. Ни загрузки на сервер, ни очереди. Откройте страницу, выключите Wi-Fi — всё продолжит работать.

Это важнее, чем кажется. Немалая часть списков, которые хочется отсортировать, — как раз те, что не стоит вставлять на случайный сайт: почты клиентов, внутренние хостнеймы, выгруженные ID пользователей.

Вставьте список в Сортировку строк текста — он пересортируется прямо во время ввода.

Попробуйте инструмент

Сортировка строк текста →