¿Cómo ordenar la cadena que se combinó con cadena + numérica usando el script bash?

27

Estos son los datos que quiero ordenar. Pero sorttrata la cadena numérica, los datos no se ordenaron como esperaba.

/ home / files / profile1
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16
/ home / files / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9

Quiero ordenar esto,

/ home / files / profile1
/ home / files / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16

¿Hay una buena manera de bash script? No puedo usar el script Ruby o Python aquí.

usuario760548
fuente
intente usar "sort -nd"
bobah
1
@bobah, "sort: las opciones` -dn 'son incompatibles "
maxschlepzig
10
sort -Vharía.
Thor
2
@Thor. su comentario sería una buena respuesta
Peter
stackoverflow.com/questions/13088370/sort-numerically
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

21

Puede usar un carácter centinela temporal para delimitar el número:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

Aquí, el personaje centinela es ';' - no debe ser parte de ningún nombre de archivo que desee ordenar, pero puede intercambiar ';' con cualquier personaje que te guste. Tienes que cambiar el sed, sorty trparte luego en consecuencia.

La tubería funciona de la siguiente manera: el sedcomando inserta el centinela antes de cualquier número, el sortcomando interpreta al centinela como delimitador de campo, se ordena con el segundo campo como una clave de clasificación numérica y el trcomando elimina el centinela nuevamente.

Y logdenota el archivo de entrada: también puede canalizar su entrada sed.

maxschlepzig
fuente
Me gusta la forma en que resolvió el problema :)
SHW
44

Esto es muy similar a esta pregunta . El problema es que tiene un campo alfanumérico en el que está ordenando y -nno lo trata con sensatez, sin embargo, la versión sort ( -V) sí. Por lo tanto, use:

sort -V

Tenga en cuenta que esta característica actualmente es compatible con las implementaciones de ordenación GNU, FreeBSD y OpenBSD.

Thor
fuente
¿Sabes lo portátil que es esto? Esta opción no parece ser parte de la especificación POSIX.
Ernest A
@ErnestA: Tienes razón, esta es una solución específica de GNU. Se agregó una nota.
Thor
@ErnestA: Parece que FreeBSD y OpenBSD han agregado esta función.
Thor
Y no funciona si los números tienen prefijos diferentes.
Dante
1
Para cualquier lector: ¡Tenga en cuenta que este es un CAPITAL V! sort -VNo usar sort -v. Es difícil saberlo a primera vista.
Gabriel Staples
7

Si todos los nombres de archivo tienen el mismo prefijo antes de la parte numérica final, ignórelo al ordenar:

sort -k 1.20n

(20 es la posición del primer dígito. Es uno más la longitud de /home/files/profile).

Si tiene varias partes no numéricas diferentes, inserte un centinela .

Gilles 'SO- deja de ser malvado'
fuente