Как отсортировать строки текста онлайн (и почему 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 пользователей.
Вставьте список в Сортировку строк текста — он пересортируется прямо во время ввода.