¿Cómo ordenar la cadena que se combina con cadena + numérico usando un script bash?

¿Cómo ordenar la cadena que se combina con cadena + numérico usando un script bash?

Estos son los datos que quiero ordenar. Pero sorttrata el número numérico como una cadena, los datos no se ordenan 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 /archivos/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6 /home/files
/profile7
/home/files/profile8
/home/files/profile9

Quiero ordenar esto para,

/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 /archivos/profile9
/home/files/profile10
/home/files/profile11
/home/files/profile12
/home/files/profile14
/home/files/profile15
/home/files/profile16

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

Respuesta1

Esto es muy similar aesta pregunta. El problema es que tiene un campo alfanumérico que está ordenando y -nno lo trata con sensatez, sin embargo, la versión sort ( -V) lo hace. Así utilizar:

sort -V

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

Respuesta2

Puedes utilizar 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 carácter centinela es ';' - no debe ser parte de ningún nombre de archivo que desee ordenar, pero puede intercambiar el ';' con cualquier personaje que te guste. Tienes que cambiar la sedparte sorty trluego en consecuencia.

La canalización funciona de la siguiente manera: el sedcomando inserta el centinela antes de cualquier número, el sortcomando interpreta el centinela como delimitador de campo, ordena con el segundo campo como 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 a sed.

Respuesta3

Si todos los nombres de sus archivos 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,insertar un centinela.

información relacionada