Estos son los datos que quiero ordenar. Pero sort
trata 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 -n
no 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 sed
parte sort
y tr
luego en consecuencia.
La canalización funciona de la siguiente manera: el sed
comando inserta el centinela antes de cualquier número, el sort
comando interpreta el centinela como delimitador de campo, ordena con el segundo campo como clave de clasificación numérica y el tr
comando elimina el centinela nuevamente.
Y log
denota 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.