Ce sont les données que je veux trier. Mais sort
traite le numérique en chaîne, les données ne sont pas triées comme je m'y attendais.
/ home / fichiers / 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 trier ça pour,
/ home / fichiers / profile1
/ home / fichiers / profile2
/ home / fichiers / 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
Existe-t-il un bon moyen par script bash? Je ne peux pas utiliser de script ruby ou python ici.
la source
sort -V
ferait.Réponses:
Vous pouvez utiliser un caractère sentinelle temporaire pour délimiter le nombre:
Ici, le caractère sentinelle est ';' - il ne doit faire partie d'aucun nom de fichier que vous souhaitez trier - mais vous pouvez échanger le ';' avec n'importe quel personnage que vous aimez. Vous devez modifier le
sed
,sort
puistr
séparer en conséquence.Le canal fonctionne comme suit: La
sed
commande insère la sentinelle avant tout nombre, lasort
commande interprète la sentinelle comme délimiteur de champ, trie avec le deuxième champ comme clé de tri numérique et latr
commande supprime à nouveau la sentinelle.Et
log
dénote le fichier d'entrée - vous pouvez également diriger votre entrée danssed
.la source
C'est très similaire à cette question . Le problème est que vous avez un champ alphanumérique que vous
-n
triez et ne le traite pas de manière sensible, contrairement à la version sort (-V
). Utilisez donc:Notez que cette fonctionnalité est actuellement prise en charge par les implémentations de tri GNU, FreeBSD et OpenBSD.
la source
sort -V
passort -v
. C'est difficile à dire à première vue.Si tous vos noms de fichiers ont le même préfixe avant la dernière partie numérique, ignorez-le lors du tri:
(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 .
la source