Числовая сортировка в файле с разделителями-запятыми в Unix

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

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 ответа

Решение

Это, конечно, грязный обходной путь, но я нашел способ сделать это благодаря подсказке @ 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

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

$ 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

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

Пытаться:

sort -t',' -g <whatever>

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

cat commafile | tr , " " | sort -n 

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

Другие вопросы по тегам