Числовая сортировка в файле с разделителями-запятыми в 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
- должен помочь тебе.