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
Just do two things:
-g
(or --general-numeric-sort
) to make sort
treat Exp-numbers correctly.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.
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
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.
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"