Сортировка научного числа с видом Unix

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

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

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

sort -nr file.txt

Что правильный путь состоит в том, чтобы сделать это?

19
задан neversaint 15 April 2010 в 02:17
поделиться

3 ответа

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

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

39
ответ дан 30 November 2019 в 02:29
поделиться

, если ваша сортировка не имеет -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"
8
ответ дан 30 November 2019 в 02:29
поделиться

Хорошо, вот не полностью протестированная версия скрипта 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
1
ответ дан 30 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

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