Sorting Scientific Number With Unix Sort

后端 未结 4 1752
面向向阳花
面向向阳花 2021-02-02 12:12

I tried to sort these number with Unix sort, but it doesn\'t seem to work:

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

This is

相关标签:
4条回答
  • 2021-02-02 12:35

    Just do two things:

    1. Use -g (or --general-numeric-sort) to make sort treat Exp-numbers correctly.
    2. Use LC_ALL=C. The sort is very sensible to locale if your data may contain some language-specific symbols except ASCII. So using LC_ALL=C is the universal approach for every case you use the sort, it makes sort to treat the input stream as binary, and you wouldn't have any problems.

    So the universal solution is:

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

    Also I made an alias for sort in my .bashrc file:

    alias csort="LC_ALL=C sort"

    for much convinient use.

    0 讨论(0)
  • 2021-02-02 12:47

    Ok, here is a not fully tested version of Python script. Supposed usage:

    sort_script.py file.txt
    

    Unfortunately I developed this on Windows, and with 2 different versions of Python installed I cannot test it properly. Warning: requires newest Python (with, print functions added or changed). Note: back_to_file flag can be an optional parameter, although with Unix you can always redirect ... even in Windows you can.

    #!/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
    
    0 讨论(0)
  • 2021-02-02 12:49

    Use -g (long form --general-numeric-sort) instead of -n. The -g option passes the numbers through strtod to obtain their value, and it will recognize this format.

    I'm not sure if this is available on all implementations of sort, or just the GNU one.

    0 讨论(0)
  • 2021-02-02 12:51

    if your sort doesn't have -g, another way.

    $ 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"
    
    0 讨论(0)
提交回复
热议问题