Voici une liste de fichiers:
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
Maintenant, je voudrais trier numériquement. Commençant par * 23 * et se terminant par * 102 *.
J'ai essayé -n
et -g
. -t
ne aide pas dans ces chaînes en désordre.
Puis-je ignorer les chaînes principales du nombre avec une option ou dois-je être intelligent et script?
Utilisez ls -lv
De la page de manuel:
-v natural sort of (version) numbers within text
Essayez ce qui suit:
sort -t '_' -k 2n
-t '_'
(définit le délimiteur sur le caractère de soulignement)-k 2n
(trie par la deuxième colonne en utilisant l'ordre numérique)Dans le cas général, essayez la transformation Schwartzian .
En bref, séparez le nombre dans son propre champ, triez-le et supprimez le champ ajouté.
# In many shells, use ctrl-v tab to insert a literal tab after the first \2
sed 's/^\([^0-9]*\)\([0-9][0-9]*\)/\2 \1\2/' file |
sort -n |
cut -f2-
Cela fonctionne bien si l'entrée n'a pas de séparateur évident, comme pour l'entrée suivante.
abc1
abc10
abc2
où vous souhaitez que la sorte déplace la dernière ligne juste après la première.
Si disponible, utilisez simplement sort -V
. Ceci est une sorte de numéro de version, mais fonctionne bien comme une option de "tri naturel".
$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )
Sans trier:
$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
Avec le tri -V:
$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt