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

14372
dpatchery

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

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

8
примеры, которые я вижу [здесь] (http://www.softpanorama.org/Tools/sort.shtml), показывают, что опция `-t` имеет пробел между` -t` и символом SeanC 11 лет назад 0
Первая мысль - использовать вырезать. Он выбирает только определенный столбец на основе заданного разделителя. Также ответ "Артем Айс" с тр. Я люблю тр. Хотя мне лень писать и проверять это. Ура! Vorac 11 лет назад 0
Возможно то же самое для табуляции char: http://stackoverflow.com/questions/1037365/unix-sort-with-tab-delimiter Ciro Santilli 新疆改造中心 六四事件 法轮功 9 лет назад 0

4 ответа на вопрос

9
dpatchery

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

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

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

Пытаться:

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

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

cat commafile | tr, " " | sort -n 

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

Похожие вопросы