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


27

Estes são os dados que eu quero classificar. Mas sorttrata o numérico para string, os dados não classificados como eu esperava.

/ home / arquivos / profile1
/ home / arquivos / profile10
/ home / arquivos / profile11
/ home / arquivos / profile12
/ home / arquivos / 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

Eu quero classificar isso para,

/ home / arquivos / profile1
/ home / arquivos / profile2
/ home / arquivos / profile3
/ home / arquivos / profile4
/ home / arquivos / profile5
/ home / arquivos / 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

Existe uma boa maneira de bash script? Não posso usar scripts ruby ​​ou python aqui.


tente usar "sort -nd"
bobah

11
@bobah "tipo: opções` -dn' são incompatíveis"
maxschlepzig

10
sort -Vfaria.
Thor

2
@Thor. o seu comentário faria uma boa resposta
Peter.O

Respostas:


21

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 é ';' - ele não deve fazer parte de nenhum nome de arquivo que você deseja classificar - mas você pode trocar o ';' com qualquer personagem que você gosta. Você tem que mudar a sed, sorte trparte em seguida em conformidade.

O canal funciona da seguinte maneira: 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 sed.


Eu gosto do jeito que você resolveu o problema :)
SHW 26/06

44

Isso é muito semelhante a esta pergunta . O problema é que você tem um campo alfanumérico no qual está classificando e -nnão o trata de maneira sensata, da mesma forma que a versão sort ( -V). Assim use:

sort -V

Note que este recurso é atualmente suportado pelas implementações de classificação GNU, FreeBSD e OpenBSD.


Você sabe o quão portátil é isso? Esta opção não parece fazer parte da especificação POSIX.
Ernest A

@ ErnestA: Você está certo, esta é uma solução específica para classificação GNU. Adicionada uma nota.
Thor

@ ErnestA: Parece que o FreeBSD e o OpenBSD adicionaram esse recurso.
Thor

E não funciona se os números tiverem prefixos diferentes.
Dante

11
Para qualquer leitor: Observe que este é um CAPITAL V! sort -VNão use sort -v. É difícil dizer à primeira vista.
Gabriel Staples

7

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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.