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

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 миллионов строк, таким образом, обходные пути или другие неортодоксальные методы вполне приемлемы.

dpatchery
источник
примеры, которые я здесь вижу , показывают, что -tопция имеет пробел между -tи символом
SeanC
Первая мысль - использовать вырезать. Он выбирает только определенный столбец на основе заданного разделителя. Также ответ "Артем Айс" с тр. Я люблю тр. Хотя мне лень писать и проверять это. Ура!
Vorac
То же самое возможно для табуляции char: stackoverflow.com/questions/1037365/…
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Ответы:

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
dpatchery
источник
Ах, видите, я бы предложил использовать немецкий язык или подобное. Сейчас я не могу думать ни о чем другом, не имея возможности протестировать его или какие инструменты у вас есть, так как это довольно редкая версия Unix.
slhck
@slhck Похоже, в этом суть большинства проблем, с которыми я сталкиваюсь в UNIX :) Спасибо за вашу помощь в поиске решения, несмотря ни на что.
dpatchery
6

GNU 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
slhck
источник
У меня нет доступа к GNU в моей среде. Это то, что я мог легко получить, а затем удалить, когда я закончу? HMU в чате, если кто-то хотел бы помочь мне сделать это ... Я новичок в UNIX.
dpatchery
Я уверен, что это просто localeпроблема. Но что sort --versionдля тебя на самом деле?
slhck
сортировка - версия дает мне недопустимый аргумент. --команды не работали для меня в прошлом либо. Я проверил страницу справочника, и там нет явной версии, но в ней есть «HP-UX 11i Version 2: August 2003», если это поможет. Мой LC_NUMERIC установлен на "C".
dpatchery
Немецкий язык, например, будет использовать ,в качестве десятичного разделителя. Я никогда не использовал HP-UX, хотя.
slhck
1

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

Пытаться:

sort -t',' -g <whatever>
HeatfanJohn
источник
Разве это не -nцифровая сортировка? -г дает мне нелегальный вариант.
dpatchery
-gэто general-numeric-sortопция, которая должна быть доступна в любой последней версии sort. @dpatchery
slhck
Это у меня на работе, поэтому у меня почти наверняка нет последней версии :)
dpatchery
0

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

cat commafile | tr , " " | sort -n 

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

defhlt
источник