команда sort в linux

Команда sort в Linux

sort – простая и очень полезная команда, которая меняет порядок строк в текстовом файле, то есть осуществляет их сортировку по алфавиту или в соответствии с числовыми значениями. По умолчанию правила сортировки следующие:

Правила сортировки можно изменять при помощи опций. Мы рассмотрим их ниже.

Синтаксис

Основной синтаксис команды следующий

Команда также может быть использована в составе конвейеров (пайпов). Например

Опции

Как видим, сейчас строки выводятся в том же порядке как и были записаны. Для его сортировки в алфавитном порядке выполните команду:

Вы получите следующий результат:

Как видим сейчас строки отсортированы в алфавитном порядке.

Вывод результатов в файл

Выведем файл output.txt:

Вывод результатов в обратном порядке

Сортировка по заданным полям

Для сортировки по определенным полям используется опция –k. Она указывается в следующем формате:

Где ПОЛЕ1 и т.д. – номер поля (столбца), по которому осуществляется сортировка. Для примера создадим новый файл prices.txt со следующим содержимым:

Для его сортировки по второму столбцу можно выполнить следующую команду:

Результат будет следующим

На первый взгляд кажется что команда сработала неправильно. Действительно, кажется что в самом верху должны стоять сливы, а яблоки нижней строкой, да и апельсины дороже банан. Но на самом деле команда sort воспринимает цифры не как число, а как строку, т.е сортировка происходит по первой цифре. Вот тогда все встает на свои места команда вывела последовательность не числовую сортировку «200-150-80-60-50» а строковую «1-2-5-6-8».

Если просто указать номер поля, результат сортировки будет следующим:

Значение начальной позиции сортировки 4 заставит команду игнорировать первые 3 буквы и начнет сортировку с 4-й, т.е после «ст.» и «мл.»

Удаление дублирующих записей

Выведет следующий результат:

Проверка сортировки

Audi
Cadillac
BMW
Dodge

Для проверки выполним следующую команду:

Мы видим, что строка «BMW» нарушает порядок сортировки:

Заключение

Команда sort – простой, но очень мощный и полезный при работе с данными инструмент. У нее есть множество разнообразных опций, помимо уже рассмотренных, которые можно узнать на соответствующей man-странице. Кроме того, ее можно использовать совместно с командами find и join для поиска по большому количеству файлов или объединения результатов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Команда sort в linux

Команда sort сортирует содержимое файла в алфавитном или нумерологическом порядке. Если задать несколько файлов, то команда sort соединит их и, рассортировав, выдаст единым выводом. По умолчанию, объектом сортировки будут строки, однако опции позволяют выбирать объект сортировки: колонки, столбцы и прочие элементы форматирования файла. Разделителем между ними служат пробелы, однако соответствующие опции позволяют задать иные разделители.

Команда sort весьма древняя, она может служить образцом программирования утилит в ранних 70-х годах прошлого века. У команды множество опций, и их разнообразные сочетания, а также способы задания разделителей, хорошо развивают память и воображение.

Программа sort без опций

Я составил список своих должников и записал их в файл debts.txt:

Если мне придет в голову рассортировать должников по алфавиту, то я дам команду:

А могу и в обратном алфавиту порядке:

Параметры sort

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

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

У нас есть еще одна колонка с числами месяцев, можно для тренировки рассортировать список по числам разных месяцев, хотя никакого практического смысла это не имеет:

Видите, в пятой колонке числа идут по возрастающей. Древность программы сказывается еще и в том, что можно вводить опции по-разному. Например можно набрать:

с тем же результатом. И даже:

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

Указав пятый символ (считая точки) во второй колонке (-k2.5), мы получили алфавитный список сотрудников.

Теперь рассмотрим файл ivanov.txt:

Рассортируем его строго по второй колонке, не принимая во внимание колонку с инициалами:

Мы видим, что Ивановы идут в том же порядке, что и в исходном файле. А если мы хотим рассортировать Ивановых в алфавитном порядке их инициалов?

Мы приказали использовать для сортировки вторую и третью колонки текста (-k 2,3). Теперь Ивановы отсортированы и по инициалам. Но важнее знать, кто из Ивановых больше должен:

Старый стиль работает на новых версиях программы, но рассматривать его в подробностях я не стану, чтобы не запутаться самому и не запутать читателя. Нам хватит путаницы и с новым стилем.

Мы уже познакомились с ней. Она заставляет команду sort сортировать в обратном порядке. (От ‘z’ к ‘a’ и от 1000000 к 0).

Названия месяцев у нас в 4 колонке, поэтому пишем:

Вуаля! Мне это почему-то кажется чудом. Можно задать ту же команду и по-другому:

Опция М преобразует первые три непробельные символа указанного столбца в заглавные буквы (Скажем, SEP означает SEPtember), а затем сравнивает их и располагает в порядке годового круга.

Позволяет указать иной разделитель объектов сортировки вместо пробела. Вернемся к файлу pay.txt:

В первый раз, чтобы рассортировать должников по фамилиям, мы указывали пятую букву в третьем столбце (считая разделителем столбцов пробелы). Есть другой способ решить эту задачу:

Теперь мы задали разделителем точку и указали четвертую колонку.

Давайте рассортируем по алфавиту шеллы, доступные в системе, указав разделителем слэш (-t ‘/’):

В директории /etc масса файлов, в которых встречаются различные разделители. Часто это двоеточие:

Эта команда рассортирует файл /etc/passwd в порядке возрастания идентификационных номеров пользователей. Проделайте этот пример самостоятельно, у него длинный вывод, боюсь мой редактор будет не в восторге.

Надеюсь, с разделителями все ясно, правила их задания очень напоминают команду cut.

Эта опция проверяет порядок сортировки, сама ничего не сортируя. Создадим файл 123.txt:

Вывод «неправильный порядок: 1» сообщает нам номер строки с первой ошибкой.

Скрывает одинаковые объекты. Если в процессе сортировки выявилось несколько одинаковых объектов, то будет выведен только первый из них, остальные проигнорированы:

Остался только один Иванов из трех.

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

то все Ивановы остались бы на своих местах. Ответьте: почему? (Ответ в приложении [1]).

Игнорирует пробелы в начале строк, и сортирует так, словно пробелов нет. Возьмем файл run.txt

Применим команду sort без опций:

Фактически произошла сортировка по количеству пробелов, так как пробел предшествует буквам в порядке сортировки. Введем команду:

Теперь строки отсортированы в алфавитном порядке, невзирая на пробелы.

Немного усложним файл run.txt

И попробуем выстроить животных по алфавиту:

как все становится на свои места.

Признает только буквы, цифры и пробелы и сортирует как в словаре.

При обычной сортировке, заглавные буквы идут прежде строчных:

Позволяет сортировать числа, записанные в общей математической форме. Возьмем файл notation.txt:

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

Также пригодится для сортировки больших файлов. Она создаст в основной памяти буфер указанного размера.

Кстати, коли речь зашла о работе с большими файлами, то полезно бывает переместить эти процессы на задний план, чтобы можно было работать, не дожидаясь завершения процесса:

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

Послесловие

Другое дело сочетания различных опций друг с другом. Если вы соорудили заковыристое заклинание из множества разных опций, а оно не работает, попробуйте убрать ту или другую опцию, может быть поможет. А лучше идти от простого к сложному, постепенно усложняя команду, пока не достигнете нужного результата. Хорошо помогает набрать вашу команду в поисковой строке Гугла, вдруг повезет. Кстати, только этим способом я смог разобраться с некоторыми опциями, о которых пишу в этой статье.

Команда sort и кириллица

Команда sort работает с нашими буквами неадекватно.

Резюме команды sort

Чрезвычайно полезная и «мощная» команда. С ее помощью не проблема выявить в огромной директории файлы, которые вы вчера потеряли (по дате модификации), или собрать «в кучу» все линки, чтобы их проверить, и так далее. А в качестве фильтра в программных каналах (pipes), эта команда просто незаменима и позволяет творить чудеса.

Приложение

[1] Ответ на задачу про Ивановых.

Источник

Сортировка файлов в командной оболочке Linux

Ищете новый способ организации своих файлов и выполнения над ними каких-либо операций? Тем, кто работает с компьютерами, часто надо что-то отсортировать. Например, список файлов. Сортировка файлов с помощью Bash-команд sort и ls поможет вам навести порядок в своих материалах. Здесь мы поговорим об основах сортировки файлов и их содержимого в Linux.

Предварительные требования

Тут, при разборе примеров, используется Ubuntu 20.04, но вам, для того чтобы попробовать то, о чём мы будем говорить, подойдёт любой дистрибутив Linux.

Алфавитная сортировка файлов

Существует множество способов сортировки файлов в Linux. Предлагаю начать с самого распространённого способа — с сортировки файлов по алфавиту.


Алфавитная сортировка файлов

Сортировка файлов по размеру

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

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


Сортировка файлов по размеру

Сортировка файлов по времени их модификации

Возможно, вам понадобится отсортировать файлы по времени их модификации. Например, вы забыли имя созданного файла, но помните время, когда его создавали.


Сортировка файлов по времени модификации

Сортировка файлов по расширению

Если вам нужен файл определённого типа, в деле по его поиску вам может очень хорошо помочь сортировка файлов по расширению.


Сортировка файлов по расширению

Обратите внимание на то, что эта команда, выводя группу файлов с одним и тем же расширением, сортирует файлы в пределах этой группы по именам в восходящем порядке.

Сортировка содержимого текстового файла

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

Ниже показано содержимое файла, отсортированное по алфавиту в восходящем порядке.


Сортировка содержимого файла по алфавиту в восходящем порядке

Сортировка списка чисел в текстовом файле

Теперь, чтобы отсортировать числа в этом файле, выполним следующую команду.


Сортировка чисел в файле

Видно, что числа, находящиеся в файле, отсортированы от самого маленького к самому большому.

Сортировка списка номеров версий программы в текстовом файле

Теперь выполним команду такого вида:


Сортировка номеров версий в файле

Поиск файлов с заданным расширением и их сортировка

В предыдущих примерах мы решали наши задачи с помощью запуска какой-то одной команды ( ls или sort ). Но при работе в Linux часто возникает необходимость совместного использования двух или большего количества команд. Как это сделать? Сделать это можно с помощью конвейера команд, перенаправляющего выходные данные одной команды на вход другой команды.


Поиск и вывод нужных файлов с сортировкой их по алфавиту в нисходящем порядке

Итоги

Я написал эту статью для того, чтобы показать всем желающим различные возможности по сортировке файлов с помощью Bash-команд в Linux. Теперь вы знаете о том, как сортировать списки файлов и то, что содержится в файлах. Вы теперь умеете создавать конвейеры из команд для выполнения более сложных операций сортировки файлов. И, кстати, обладая этими знаниями, вы вполне можете написать скрипты, которые автоматизируют задачи сортировки файлов и содержимого файлов.

НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

Источник

10 полезных примеров команды Sort в Linux

Главное меню » Операционная система Linux » 10 полезных примеров команды Sort в Linux

Команда Sort в Linux

Команда sort упорядочивает текстовые строки полезными способами. Этот простой инструмент может помочь вам быстро отсортировать информацию из командной строки.

Вы должны отметить несколько вещей:

Правила по умолчанию в команде sort

Это правила по умолчанию при использовании сортировки. Первые несколько примеров прояснят, как управляются эти приоритеты. Тогда мы рассмотрим специализированные варианты.

Примеры команды сортировки

Позвольте нам показать вам несколько примеров команды sort, которые вы можете использовать в различных ситуациях.

1. Сортировка в алфавитном порядке

Команда sort по умолчанию позволяет легко просматривать информацию в алфавитном порядке. Никаких опций не требуется, и даже для записей со смешанным регистром сортировка AZ работает должным образом

Linux
Debian
Mint
CentOS
Ubuntu

Вот отсортированный по алфавиту вывод:

Давайте возьмем тот же список, который мы использовали в предыдущем примере, и отсортируем по порядку номеров. Если вам интересно, список отражает одни из дистрибутивов Linux.

Мы изменили содержимое файла так, чтобы элементы были пронумерованы, но не в порядке, как показано ниже.

1. Debian
2. CentOS
3. Linux
4. Mint
5. Ubuntu

После сортировки результат:

Выглядит хорошо, правда? Вы можете полагаться на этот метод, чтобы точно расположить ваши данные? Возможно нет. Давайте посмотрим на другой пример, чтобы выяснить, почему.

Вот наш новый образец текста:

Теперь, если мы используем команду sort без каких-либо опций, то вот что мы получим:

Теперь у вас будет правильно отсортированный вывод:
1
2
3
5
5
10
21
23
60
432

Для этого мы снова будем использовать наш список дистрибутивов. Обратная функция не требует пояснений. Это изменит порядок содержимого вашего файла.

И здесь у вас есть выходной текст в обратном порядке:

Вот случайно отсортированный вывод:

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

Вот пример текстового файла в этом примере:

Mar
March
February
Apr
April
August
July
June
November
September
1
4
3
6
01/03/19
01/08/19
02/09/18

Вот результат, который вы увидите:

6. Сохраните отсортированные результаты в другой файл

Как мы упоминали ранее, сортировка не изменяет исходный файл по умолчанию. Если вам нужно сохранить отсортированный контент, это можно сделать.

Для этого примера мы создали новый файл, в котором хотим, чтобы отсортированная информация была напечатана и сохранена с именем andreyex_sorted.txt.

Внимание: если вы попытаетесь перенаправить отсортированные данные в один и тот же файл, он сотрет содержимое вашего файла.

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

1. Debian 300
2. CentOS 200
3. Linux 100
4. Mint 400
5. Ubuntu 500

Это позволит отсортировать текст во втором столбце в алфавитном порядке:

Это позволит отсортировать текст по цифрам в третьем столбце.
3. Linux 100
2. CentOS 200
1. Debian 300
4. Mint 400
5. Ubuntu 500

То же, что и вышеупомянутая команда, только что порядок сортировки был обратным.

1. Debian
2. CentOS
3. Linux
4. Mint
5. Ubuntu
2. CentOS
3. Linux
4. Mint
1. Debian
3. Linux
5. Ubuntu

Вот выходные файлы отсортированы и без дубликатов.

Вот вывод, где случаи игнорируются командой sort:

Эта опция позволяет сравнивать буквенно-цифровые значения, такие как 2k (то есть 2000).

Вот отсортированный вывод:

Мы надеемся, что эта статья помогла вам получить базовое использование команды sort в Linux. Если у вас есть какой-нибудь классный трюк, почему бы не поделиться им с нами в разделе комментариев?

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Как Linux’овский sort сортирует строки

Всё началось с короткого скрипта, который должен был объединить информацию об адресах e-mail сотрудников, полученных из списка пользователей почтовой рассылки, с должностями сотрудников, полученными из базы отдела кадров. Оба списка были экспортированы в текстовые файлы в кодировке Юникод UTF-8 и сохранены с юниксовскими концами строк.

Для объединения файлы были отсортированы юниксовской командой sort и поданы на вход юниксовской программе join, которая неожиданно завершилась с ошибкой:

Просмотр результата сортировки глазами показал, что в целом сортировка правильная, но в случае совпадений мужских и женских фамилий, женские идут перед мужскими:

Выглядит как глюк сортировки в Юникоде или как проявление феминизма в алгоритме сортировки. Первое, конечно, правдоподобнее.

Отложим пока join и сосредоточимся на sort. Попробуем решить задачу методом научного тыка. Для начала, поменяем локаль с en_US на ru_RU. Для сортировки достаточно было бы установить переменную окружения LC_COLLATE, но мы не будем мелочиться:

Ничего не изменилось.

Попробуем перекодировать файлы в однобайтовую кодировку:

Опять ничего не поменялось.

Ничего не поделаешь, придётся искать решение в интернете. Прямо про русские фамилии ничего нет, но есть вопросы про другие странности сортировки. Вот, например, такая проблема: unix sort treats ‘-‘ (dash) characters as invisible. Если кратко, то строки «a-b», «aa», «ac» сортируются как «aa», «a-b», «ac».

Ответ везде стандартный: используйте программистскую локаль «C» и будет вам счастье. Пробуем:

Что-то поменялось. Ивановы выстроились в правильном порядке, правда Ёлкина куда-то сползла. Возвращаемся к исходной задаче:

Сработало без ошибок, как и обещал интернет. И это несмотря на Ёлкину в первой строке.

Проблема вроде бы решена, но на всякий случай попробуем ещё одну русскую кодировку — виндоузовскую CP1251:

Результат сортировки, как ни странно, совпадёт с локалью «C», и весь пример, соответственно, проходит без ошибок. Мистика какая-то.

В конце я попытаюсь ответить на вопросы:

Сортировка в Юникоде

Первой остановкой будет технический отчёт № 10 под названием Unicode collation algorithm на сайте unicode.org. Отчёт содержит много технических деталей, так что я позволю себе привести краткое изложение основных идей.

Collation — «сравнение» строк — основа любого алгоритма сортировки. Сами алгоритмы могут отличаться («пузырьком», «слиянием», «быстрый»), но все они будут использовать сравнение пары строк, для определения порядка их следования.

Сортировка строк на естественном языке — это довольно сложная проблема. Даже в простейших однобайтовых кодировках порядок букв в алфавите, хоть в чём-то отличающемся от английской латиницы, уже не будет совпадать с порядком числовых значений, которыми эти буквы кодируются. Так в немецком алфавите буква Ö стоит между О и P, а в кодировке CP850 она попадает между ÿ и Ü.

Можно попытаться абстрагироваться от конкретной кодировки и рассматривать «идеальные» буквы, которые расположены в некотором порядке, как это сделано в Юникоде. Кодировки UTF8, UTF16 или однобайтовая KOI8-R (если нужно ограниченное подмножестве Юникода) будут давать разные числовые представления букв, но ссылаться при этом на одни и те же элементы базовой таблицы.

Оказывается, что даже построив таблицу символов с нуля, мы не сможем назначить в ней универсальный порядок символов. В различных национальных алфавитах, использующих одинаковые буквы, порядок этих букв может отличаться. Например, во французском языке Æ будет считаться лигатурой и сортироваться как строка AE. В норвежском же языке Æ будет отдельной буквой, которая располагается после Z. Кстати, кроме лигатур типа Æ существуют буквы, записываемые несколькими символами. Так в чешском алфавите есть буква Ch, которая стоит между H и I.

Кроме различия в алфавитах существуют и иные национальные традиции, влияющие на сортировку. В частности возникает вопрос: в каком порядке должны следовать в словаре слова, состоящие из прописных и строчных букв? Также на сортировку могут повлиять особенности использования знаков препинания. В испанском языке в начале вопросительного предложения ставится перевёрнутый вопросительный знак (¿Te gusta la música?). В этом случае очевидно, что вопросительные предложения не должны группироваться в отдельный кластер вне алфавита, а как сортировать строки с другими знаками препинания?

Я не буду останавливаться на сортировке строк в языках сильно отличающихся от европейских. Отмечу, что в языках с направлением письма справа налево или сверху вниз символы в строках, скорее всего, хранятся в порядке чтения, и даже в неалфавитных письменностях есть свои способы посимвольного упорядочения строк. Например, иероглифы могут упорядочиваться по начертанию (ключи китайских иероглифов) или по произношению. Как должны упорядочиваться эмодзи, я, честно говоря, не представляю, но и для них можно что-нибудь придумать.

На основе перечисленных выше особенностей были сформулированы основные требования к сравнению строк, основанных на таблицах Юникода:

Кроме того, авторы отчёта сформулировали свойства сравнения, на которые разработчики алгоритма не должны полагаться:

Строка LC_COLLATE говорит нам, что далее начинаются данные, описывающие сравнение строк.

Сначала задаются имена для весов в таблице сравнения и имена для комбинаций символов. Вообще говоря, два типа имён принадлежат двум разным сущностям, но в реальном файле они перемешаны. Имена весов задаются ключевым словом collating-symbol (символ сравнения), поскольку при сравнении символы Юникода, имеющие одинаковые веса, будут считаться эквивалентными символами.

Общая длина секции в текущей ревизии файла около 900 строк. Я надёргал примеры из нескольких мест, чтобы показать произвольность имён и несколько видов синтаксиса.

Когда имена весов определены, задаются собственно веса. Поскольку при сравнении имеет значение только отношения больше-меньше, то веса определяются простой последовательностью перечисления имён. Сначала перечисляются более «лёгкие» веса, затем более «тяжёлые». Напомню, что каждому юникодовскому символу присваивается четыре разных веса. Здесь они сведены в единую упорядоченную последовательность. Теоретически, любое символическое имя может использоваться на любом из четырех уровней, но комментарии указывают на то, что разработчики мысленно разделяют имена по уровням.

Наконец, собственно таблица весов.

Секция весов заключена в строки с ключевыми словами order_start и order_end. Дополнительные параметры order_start определяют, в каком направлении просматриваются строки на каждом уровне сравнения. По умолчанию используется параметр forward. Тело секции состоит из строк, которые содержат код символа и четыре его веса. Код символа может быть представлен самим символом, кодовой точкой или символическим именем, определённым ранее. Веса также могут задаваться символическими именами, кодовыми точками или самими символами. Если используются кодовые точки или символы, то их вес совпадает с числовым значением кодовой точки (позицией в таблице Юникода). Символы не указанные явно считаются приписанными в таблицу с единственным последним весом, совпадающим с позицией в таблице Юникода. Специальное значение веса IGNORE означает, что на соответствующем уровне сравнения данный символ игнорируется.

Для демонстрации структуры весов я выбрал три достаточно очевидных фрагмента:

Теперь можно снова вернуться к сортировке примеров из начала статьи. Засада кроется вот в этой части таблицы весов:

Видно, что в этой таблице знаки препинания из таблицы ASCII (включая пробел) при сравнении строк практически всегда игнорируются. Исключение составляют лишь строки, совпадающие во всём, кроме знаков препинания, встречающихся в совпадающих позициях. Строки из моего примера (после сортировки) для алгоритма сравнения выглядят так:

Учитывая, что в таблице весов заглавные буквы в русском языке идут после строчных (на третьем уровне тяжелее чем ), сортировка выглядит абсолютно правильной.

При установке переменной LC_COLLATE=C загружается особая таблица, которая задаёт побайтовое сравнение

Поскольку в Юникоде кодовая точка Ё стоит перед А, то и строки сортируются соответственно.

Текстовые и двоичные таблицы

Очевидно, что сравнение строк, это чрезвычайно часто встречающаяся операция, а разбор таблицы CTT довольно затратная процедура. Для оптимизации доступа к таблице она компилируется в двоичную форму командой localedef.

Команда localedef принимает в качестве параметров файл с таблицей национальных особенностей (опция -i), в котором все символы представлены точками Юникода, и файл соответствия точек Юникода символам конкретной кодировки (опция -f). В результате работы создаются двоичные файлы для локали, с именем указанным в последнем параметре.

Glibc поддерживает два формата двоичных файлов: «традиционный» и «современный».

Традиционный формат подразумевает, что имя локали, это имя подкаталога в /usr/lib/locale/. В этом подкаталоге хранятся двоичные файлы LC_COLLATE, LC_CTYPE, LC_TIME и т.п. Файл LC_IDENTIFICATION содержит формальное имя локали (которое может отличаться от имени каталога) и комментарии.

Современный формат предполагает хранение всех локалей в едином архиве /usr/lib/locale/locale-archive, который отображается в виртуальную память всех процессов, использующих glibc. Имя локали в современном формате подвергается некоторой канонизации — в названия кодировки остаются только цифры и буквы, приведённые к нижнему регистру. Так ru_RU.KOI8-R, будет сохранено как ru_RU.koi8r.

Входные файлы ищутся в текущем каталоге, а так же в каталогах /usr/share/i18n/locales/ и /usr/share/i18n/charmaps/ для файлов CTT и файлов кодировок соответственно.

скомпилирует файл /usr/share/i18n/locales/ru_RU с использованием файла кодировки /usr/share/i18n/charmaps/MAC-CYRILLIC.gz и сохранит результат в /usr/lib/locale/locale-archive под именем ru_RU.maccyrillic

Если установить переменную LANG=en_US.UTF-8 то glibc будет искать двоичные файлы локали в следующей последовательности файлов и каталогов:

Если локаль встречается и в традиционном и в современном форматах, то приоритет отдаётся современному.

Подготовка своей таблицы сравнения

Теперь, вооружившись знаниями, можно создать собственную идеальную таблицу сравнения строк. Эта таблица должна корректно сравнивать русские буквы, включая букву Ё, и при этом учитывать знаки препинания в соответствии с таблицей ASCII.

Процесс подготовки своей таблицы сортировки состоит из двух этапов: редактирования таблицы весов и компиляции её в двоичную форму командой localedef.

Для того, чтобы таблицу сравнения можно было бы подстроить с минимальными затратами на редактирование, в формате ISO 14652 предусматриваются секции корректировки весов уже существующей таблицы. Секция начинается с ключевого слова reorder-after и указания позиции, после которой выполняется замена. Завершает секцию строка reorder-end. Если необходимо поправить несколько участков таблицы, то создаётся по секции на каждый такой участок.

Я скопировал новые версии файлов iso14651_t1_common и ru_RU из репозитория glibc в свой домашний каталог

/.local/share/i18n/locales/ и слегка подредактировал раздел LC_COLLATE в ru_RU. Новые версии файлов полностью совместимы с моей версией glibc. Если вы захотите использовать старые версии файлов, то вам придётся поменять символические имена и место, с которого начинается замена в таблице.

На самом деле, надо было бы поменять поля в LC_IDENTIFICATION так чтобы они указывали на локаль ru_MY, но в моём примере это не потребовалось, поскольку я исключил из поиска локалей архив locale-archive.

Чтобы localedef работала с файлами в моей папке через переменную I18NPATH можно добавить дополнительный каталог для поиска входных файлов, а каталог для сохранения двоичных файлов можно указать в виде пути со слэшами:

POSIX предполагает, что в LANG можно писать абсолютные пути к каталогам с файлами локалей, начинающиеся с прямого слэша, но glibc в Linux все пути считает от базового каталога, который можно переопределить через переменную LOCPATH. После установки LOCPATH=

/.local/lib/locale/ все файлы, связанные с локализацией будут искаться только в моей папке. Архив локалей при установленной переменной LOCPATH игнорируется.

Вот он решающий тест:

Ура! Мы сделали это!

Работа над ошибками

Я уже ответил на вопросы о сортировке строк, поставленные в начале, но ещё осталась пара вопросов об ошибках — видимых и невидимых.

Вернёмся к исходной задаче.

И программа sort и программа join используют одни и те же функции сравнения строк из glibc. Как же получилось, что join выдавала ошибку сортировки на строках, отсортированных командой sort в локали en_US.UTF-8? Ответ прост: sort сравнивает строку целиком, а join сравнивает только ключ, которым по умолчанию, является начало строки до первого пробельного символа. В моём примере это привело к сообщению об ошибке поскольку сортировка первых слов в строках не совпала с сортировкой полных строк.

Локаль «C» гарантирует, что в отсортированных строках начальные подстроки до первого пробела также окажутся отсортированными, но это только маскирует ошибку. Можно подобрать такие данные (люди с одинаковыми фамилиями, но разными именами), которые без сообщения об ошибке дали бы неправильный результат слияния файлов. Если мы хотим, чтобы join объединял строки файлов по ФИО, то правильным способом будет явное указание разделителя полей и сортировка по ключевому полю, а не по всей строке. В этом случае и слияние пройдёт правильно и ни в какой локали не будет ошибок:

Успешно выполнившийся пример в кодировке CP1251 содержит ещё одну ошибку. Дело в том, что во всех известных мне дистрибутивах Linux в пакетах отсутствует скомпилированная локаль ru_RU.CP1251. Если скомпилированная локаль не найдена, то sort молча использует побайтовое сравнение, что мы и наблюдали.

Заключение

Если вы программист, который привык считать, что строки это набор байтов, то ваш выбор LC_COLLATE=C.

Если вы лингвист или составитель словарей, то вам лучше скомпилировать свою локаль.

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • команда slmgr rearm для windows 7
  • команда sleep в linux
  • команда shell startup windows 10
  • команда sh linux что делает
  • команда sfc scannow windows 10 что делает

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии