Сортування чисельно у файлі, розміщеному комами, за допомогою 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 мільйонів рядків, тому обхідні шляхи чи інші неортодоксальні методи цілком прийнятні.


приклади, які я бачу тут, здається, показують -tваріант як пробіл між -tсимволом та персонажем
SeanC

Перша думка - використовуйте розріз. Він вибирає лише певний стовпчик на основі заданого роздільника. Також відповідь "Артема Айс" з tr. Я люблю тр. Мені теж лінь писати і перевіряти це. Ура!
Vorac

Відповіді:


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

Ну бачте, я б запропонував використовувати німецький або подібний. Зараз не можна думати ні про що інше, не маючи змоги протестувати його чи які інструменти у вас є, оскільки це досить рідкісна версія 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

У мене немає доступу до GNU в моєму середовищі. Це те, що я міг легко отримати, а потім видалити, коли закінчу? HMU в чаті, якщо хтось хотів би допомогти мені це зробити ... Я зовсім новачок UNIX.
dpatchery

Я впевнений, що це лише localeпитання. Але що sort --versionдля вас насправді?
slhck

sort --версія дає мені незаконні аргументи. --команди теж не працювали для мене в минулому. Я перевірив довідкову сторінку і немає жодної версії, яку явно не викликали, але вона містить список "HP-UX 11i Версія 2: серпень 2003", якщо це взагалі допомагає. Мій LC_NUMERIC встановлено на "C".
dpatchery

Наприклад, німецька мова використовується ,як десятковий роздільник. Я ніколи не використовував HP-UX.
slhck

1

Спробуйте додати -gпараметр, який повинен виконати числове сортування.

Спробуйте:

sort -t',' -g <whatever>

Чи не -nсортування чисел? -g дає мені незаконний варіант.
dpatchery

-gце general-numeric-sortваріант і насправді має бути доступним у будь-якій останній версії sort. @dpatchery
slhck

Це на моєму місці роботи, тому я майже точно не маю останньої версії :)
dpatchery

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.