¿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í.


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

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.


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.


¿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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.