web-dev-qa-db-fra.com

Comment trier les chaînes contenant un préfixe commun et un suffixe numérique de Bash?

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?

27
AWE

Utilisez ls -lv

De la page de manuel:

-v     natural sort of (version) numbers within text
37
Steve

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)

DÉMO.

30
João Silva

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.

2
tripleee

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
0
Rhubbarb