Estes são os dados que desejo classificar. Mas sort
trata o numérico como string, os dados não são classificados como eu esperava.
/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 /arquivos/perfil3
/home/arquivos/perfil4
/home/arquivos/perfil5
/home/arquivos/perfil6
/home/arquivos/perfil7
/home/arquivos/perfil8
/home/arquivos/perfil9
Eu quero resolver isso para,
/home/arquivos/perfil1
/home/arquivos/perfil2
/home/arquivos/perfil3
/home/arquivos/perfil4
/home/arquivos/perfil5
/home/arquivos/perfil6
/home/arquivos/perfil7
/home/arquivos/perfil8
/home /arquivos/perfil9
/home/arquivos/perfil10
/home/arquivos/perfil11
/home/arquivos/perfil12
/home/arquivos/perfil14
/home/arquivos/perfil15
/home/arquivos/perfil16
Existe uma boa maneira de usar o script bash? Não posso usar script Ruby ou Python aqui.
Responder1
Isto é muito semelhante aessa questão. O problema é que você tem um campo alfanumérico no qual está classificando e -n
não trata isso de maneira sensata, no entanto, o version sort ( -V
) o faz. Assim use:
sort -V
Observe que este recurso é atualmente suportado pelas implementações de classificação GNU, FreeBSD e OpenBSD.
Responder2
Você pode usar um caractere sentinela temporário para delimitar o número:
$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'
Aqui, o caractere sentinela é ';' - não deve fazer parte de nenhum nome de arquivo que você deseja classificar - mas você pode trocar o ';' com qualquer personagem que você quiser. Você tem que alterar o sed
e sort
parte tr
de acordo.
O pipe funciona da seguinte forma: O sed
comando insere o sentinela antes de qualquer número, o sort
comando interpreta o sentinela como delimitador de campo, classifica com o segundo campo como chave de classificação numérica e o tr
comando remove o sentinela novamente.
E log
denota o arquivo de entrada - você também pode canalizar sua entrada para sed
.
Responder3
Se todos os nomes de arquivos tiverem o mesmo prefixo antes da parte numérica final, ignore-o ao classificar:
sort -k 1.20n
(20 é a posição do primeiro dígito. É um mais o comprimento de /home/files/profile
.)
Se você tiver várias partes não numéricas diferentes,insira uma sentinela.