Сортировка Linux и Perl Сравнение строк - PullRequest
4 голосов
/ 21 января 2011

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

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

Есть ли надежный способ убедиться, что мои сравнения в Linux для сортировки строк и Perl используют один и тот же тип сравнения строк?

1 Ответ

8 голосов
/ 21 января 2011

Команда sort использует текущий языковой стандарт, заданный переменной среды LC_ALL, для определения порядка сортировки символов. Обычно самый простой способ решить проблемы с сортировкой - это вручную установить для этого параметра язык C, который обрабатывает каждый 8-битный байт как один символ и сравнивает по простому числовому значению. В большинстве оболочек это можно сделать как разовое для одной команды, добавив префикс следующим образом:

LC_ALL=C sort < infile > outfile

Это также решит аналогичные проблемы для некоторых других программ обработки текста. (Например, я помню проблемы с файлами CSV на компьютере немецкого человека - это было связано с тем фактом, что немцы используют запятую вместо десятичной точки. Помещение LC_ALL=C перед соответствующими командами также решило эту проблему.)

[EDIT] Хотя Perl может быть направлен на обработку некоторых строк как Unicode, по умолчанию он по-прежнему обрабатывает ввод и вывод как потоки 8-битных байтов, поэтому приведенный выше подход должен создавать порядок такой же, как в Perl sort(). (Спасибо Ven'Tatsu за этот самородок.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...