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 my command:
sort -nr file.txt
What's the right way to do it?
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 my command:
sort -nr file.txt
What's the right way to do it?
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"
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