Como classificar a string combinada com string + numérico usando o script bash?

Como classificar a string combinada com string + numérico usando o script bash?

Estes são os dados que desejo classificar. Mas sorttrata 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 -nnã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 sede sortparte trde acordo.

O pipe funciona da seguinte forma: O sedcomando insere o sentinela antes de qualquer número, o sortcomando interpreta o sentinela como delimitador de campo, classifica com o segundo campo como chave de classificação numérica e o trcomando remove o sentinela novamente.

E logdenota 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.

informação relacionada