Quiero ordenar los archivos según el número en el nombre del archivo. Aquí están los archivos:
$ ls *.f
0.f 13.f 1.f 22.f 4.f abc.f
El resultado de la clasificación:
$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f
Lo que esperaba era:
$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f
¿Por qué se abc.f
mostró justo después 0.f
y antes 1.f
? ¿Es porque 0
no es tratado como un número por sort
? Busqué en la web y no encontré ninguna referencia.
LC_ALL=C
.Respuestas:
La razón es porque cuando se usa la ordenación numérica, las cadenas sin números se tratan como cero. GNU sort consigue el comportamiento correcto, pero no hace ningún comentario sobre por qué. La página de manual de illumos para SunOS ofrece una explicación:
Este comportamiento también se especifica en SUSv4 y POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ), utilizando el mismo lenguaje que la página de manual de illumos.
La ordenación GNU también tiene
-g
"ordenación numérica general", que ordena por números de coma flotante en lugar de enteros donde las cadenas de dígitos vacías se ordenan antes de cero. No estoy seguro de si esto es un efecto secundario o intencional. Sin embargo,-g
viene con una advertencia ya que es significativamente más lenta que-n
. Si está ordenando un gran conjunto de datos o haciendo algo que los usuarios esperan, debe evitarlo-g
.fuente
sort
maneja con dos líneas que tienen la misma clave.puedes usar -g
fuente