2011-01-21 3 views
4

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

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

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

+5

Вы смотрели 'join' или' comm'? Они должны работать, если вам нужно только увидеть, какие строки отсутствуют в другом файле. –

+0

@ Предложение Даниэля хорошее - похоже, что вы в основном писали 'comm' в Perl :) Хотя интересно, что в man-странице' comm' не упоминаются локали, так что, возможно, у него будет такая же проблема, как ваш скрипт Perl. –

ответ

8

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

LC_ALL=C sort <infile> outfile 

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

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

+2

Чтобы упростить: для обратной совместимости по умолчанию все, что приходит или выходит, является потоком байтов, пока не будет сказано иначе. Параметры командной строки, прагмы, слои ввода-вывода и функции кодирования могут помечать некоторые данные в виде Юникода или применять определенное поведение кодирования для некоторых операций или дескрипторов. –

Смежные вопросы