8

У меня есть разделенный запятыми файл, который выглядит так:

100,00869184
6492,8361
1234,31
200,04071

Я хочу использовать sort для сортировки этот файл численно только в первом столбце.

Желаемый результат:

100,00869184
200,04071
1234,31
6492,8361

Как мне добиться этого с помощью сортировки? Кажется, что запятые обрабатываются как разделители тысяч, а не как разделители, даже когда я их так называю.

Оба sort -t',' -n и sort -t',' -nk1' дают мне это:

1234,31
200,04071
6492,8361
100,00869184

Сортировка по умолчанию (без параметров) или использование sort -t',' дает мне это:

100,00869184
1234,31
200,04071
6492,8361

И сортировка по числу sort -n дает мне это:

1234,31
200,04071
6492,8361
100,00869184

Как я могу использовать сортировку для достижения желаемого результата?

Отредактировано, чтобы добавить: Это для одноразовой операции, чтобы создать отсортированный список приблизительно из 7 миллионов строк, таким образом, обходные пути или другие неортодоксальные методы вполне приемлемы.

4 ответа4

9

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

Я установил испанский язык (боливийский) в качестве локали, чтобы запятые обрабатывались как десятичные точки, а затем использовалась стандартная числовая сортировка.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361
6

sort GNU делает это по умолчанию:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Версия:

$ gsort --version
sort (GNU coreutils) 8.19

Однако есть предостережение: если ваша сортировка работает не так, как ожидалось, тогда ваш locale , вероятно, настроен на что-то отличное от C Почему это? locale определяет сортировку и интерпретацию букв, цифр, десятичных символов и так далее.

Чтобы проверить это, просто введите locale в Терминале. Возможно, для LC_NUMERIC установлено значение en_US.UTF-8 ? Это объясняет неправильный порядок сортировки. Установите его обратно в C:

export LC_NUMERIC=C

Затем попробуйте команду sort снова. Если вы хотите установить глобальную locale на C , сделайте это с:

export LC_ALL=C
1

Попробуйте добавить опцию -g которая должна выполнять числовую сортировку.

Пытаться:

sort -t',' -g <whatever>
0

Заменить разделитель:

cat commafile | tr , " " | sort -n 

- должен помочь тебе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .