2010-04-15 31 views
16

traté de ordenar estos números con Unix especie, pero no parece funcionar:Clasificación Número científica con Unix Ordenar

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

Éste es mi mandamiento:

sort -nr file.txt 

¿Cuál es la correcta forma de hacerlo?

+3

Utilice python, ordenado, clave = lambda x: float (x). Python se puede usar para líneas simples. ¿Qué versión de Python está preinstalada? –

+0

@Hamish Grubijan - Probablemente deberías haber publicado eso como una respuesta, +1. Es mucho más portátil que confiar en las extensiones de GNU. –

+0

Gracias, hecho ahora. –

Respuesta

34

Utilice -g (forma larga --general-numeric-sort) en lugar de -n. La opción -g pasa los números a través del strtod para obtener su valor, y reconocerá este formato.

No estoy seguro de si esto está disponible en todas las implementaciones de sort, o solo la de GNU.

+1

Estoy bastante seguro de que inicialmente estaba centrado en GNU, pero no puedo pensar en un 'género' que no lo ofrezca ahora. Puede ser problemático, pero solo pienso en sistemas muy antiguos. –

+0

funciona en centos 7 para mí, si eso ayuda. Gracias. – jimh

7

si su sort no tiene -g, de otra manera.

$ 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" 
1

Bien, aquí hay una versión no probada de la secuencia de comandos de Python. el uso supuesta:

sort_script.py file.txt 

Por desgracia, desarrolló este en Windows, y con 2 versiones diferentes de Python instalado no puedo probarlo correctamente. Advertencia: requiere la última versión de Python (con funciones de impresión agregadas o modificadas). Nota: el indicador back_to_file puede ser un parámetro opcional, aunque con Unix siempre se puede redireccionar ... incluso en Windows se puede.

#!/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 
3

Sólo hacer dos cosas:

  1. Uso -g (o --general-numeric-sort) para hacer sort tratar EXP-números correctamente.
  2. Use LC_ALL=C. El sort es muy sensato para la configuración regional si sus datos pueden contener algunos símbolos específicos del idioma, excepto ASCII. Entonces, usando LC_ALL=C es el enfoque universal para cada caso que usa sort, hace sort para tratar el flujo de entrada como binario, y no tendría ningún problema.

Así que la solución universal es:

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

También hice un alias para una especie en mi archivo .bashrc:

alias csort="LC_ALL=C sort"

de mucho uso conveniente.

Cuestiones relacionadas