Сортировка научного номера с сортировкой Unix - PullRequest
19 голосов
/ 15 апреля 2010

Я пытался отсортировать эти числа с помощью сортировки Unix, но, похоже, это не работает:

    2e-13
    1e-91
    2e-13
    1e-104
    3e-19
    9e-99

Это моя команда:

sort -nr file.txt

Как правильно это сделать?

Ответы [ 4 ]

39 голосов
/ 15 апреля 2010

Используйте -g (длинная форма --general-numeric-sort) вместо -n. Параметр -g пропускает числа через strtod, чтобы получить их значение, и распознает этот формат.

Я не уверен, доступно ли это во всех реализациях sort или только в GNU.

8 голосов
/ 15 апреля 2010

, если у вашего sort нет -g, другой способ.

$ printf "%.200f\n" $(<file) |sort -n |xargs printf "%g\n"
1e-104
9e-99
1e-91
3e-19
2e-13
2e-13

$ sort -g file
1e-104
9e-99
1e-91
3e-19
2e-13
2e-13

$ printf "%.200f\n" `cat file` |sort -n |xargs printf "%g\n"
5 голосов
/ 11 февраля 2017

Просто сделайте две вещи:

  1. Используйте -g (или --general-numeric-sort), чтобы sort правильно обрабатывал числа Exp.
  2. Используйте LC_ALL=C. sort очень удобен для локали, если ваши данные могут содержать некоторые специфичные для языка символы, кроме ASCII. Таким образом, использование LC_ALL=C является универсальным подходом для в каждом случае, если вы используете sort, это делает sort для обработки входного потока как двоичного, и у вас не будет никаких проблем.

Итак, универсальное решение:

cat file.txt | LC_ALL=C sort -gr | less

Также я создал псевдоним для сортировки в моем .bashrc файле:

alias csort="LC_ALL=C sort"

для удобного использования.

1 голос
/ 15 апреля 2010

Хорошо, вот не полностью протестированная версия скрипта Python. Предполагаемое использование:

sort_script.py file.txt

К сожалению, я разработал это в Windows, и с двумя разными версиями Python я не могу проверить это должным образом. Внимание: требуется новейший Python (с добавлением или изменением функций печати). Примечание: флаг back_to_file может быть необязательным параметром, хотя в Unix вы всегда можете перенаправить ... даже в Windows вы можете.

#!/usr/bin/env python3.1
# Note: requires newer python

import sys

#Remove this line:
sys.argv = ('', 'file.txt')

assert(len(sys.argv) == 2)

with open(sys.argv[1], 'r') as fin:
    lines = fin.readlines()

lines_sorted = sorted(lines, key=lambda x: float(x))

back_to_file = False # Change this if needed

if back_to_file:
    with open(sys.argv[1], 'w') as fout:
        fout.writelines(lines_sorted)
else:
    for lns in lines_sorted:
        print(lns, end='') # Suppress new line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...