Comment sortinger la string qui combinée avec string + numérique en utilisant le script bash?

Ce sont datatables que je veux sortinger. Mais sort traite le numérique en string, datatables ne sont pas sortingées comme prévu.

/ 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 / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9

Je veux sortinger ça,

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

Y at-il un bon moyen par script bash? Je ne peux pas utiliser le script Ruby ou Python ici.

Vous pouvez utiliser un caractère sentinelle temporaire pour délimiter le nombre:

 $ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';' 

Ici, le caractère sentinelle est ';' – il ne doit pas faire partie d'un nom de file que vous voulez sortinger – mais vous pouvez échanger le ';' avec n'importe quel personnage que vous aimez. Vous devez changer le sed , sort et tr part alors en conséquence.

Le pipe fonctionne comme suit: La command sed insère la sentinelle avant tout nombre, la command sort interprète la sentinelle comme délimiteur de champ, sortinge avec le second champ comme key de sorting numérique et la command tr supprime de nouveau la sentinelle.

Et le log indique le file d'input – vous pouvez également canaliser votre input dans sed .

Ceci est très similaire à cette question . Le problème est que vous avez un champ alphanumérique sur lequel vous sortinger, et -n ne traite pas cela de façon raisonnable, mais le sorting de versions ( -V ). Ainsi utiliser:

 sort -V 

Notez que cette fonctionnalité est actuellement prise en charge par les implémentations de sorting GNU, FreeBSD et OpenBSD.

Si tous les noms de files ont le même préfixe avant la dernière partie numérique, ignorez-les lors du sorting:

 sort -k 1.20n 

(20 est la position du premier chiffre, c'est un plus la longueur de /home/files/profile ).

Si vous avez plusieurs parties non numériques différentes, insérez une sentinelle .