44 votes

En bash, comment trier des chaînes de caractères contenant des chiffres ?

Si j'ai ces fichiers dans un répertoire

cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf

comment puis-je les lister en Bash de sorte qu'ils soient dans l'ordre numérique croissant en fonction de la partie numérique de la chaîne. Ainsi, l'ordre résultant est cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf, etc.

Mon objectif final est de concaténer les PDF avec pdftk avec quelque chose comme ce qui suit

pdftk `ls *.pdf | sort -n` cat output output.pdf

mais cela ne fonctionne pas car mon tri est incorrect.

2voto

Scot Points 398

Voici une méthode utilisant simplement sort:

ls | sort -k1.6n

0voto

Aguevara Points 1

Sort -g est utilisé pour trier les nombres par ordre croissant.

anthony@mtt3:~$ sort --help | egrep "\-g"
-g, --general-numeric-sort  compare les valeurs numériques générales

Le ligne de commande suivante itère sur un fichier contenant les noms des fichiers PDF et récupère uniquement les nombres avec egrep -o et utilise sort -g pour trier les nombres dans l'ordre croissant. Ensuite, il envoie ces nombres à sed et les insère. Ensuite, il se débarrasse des doublons avec uniq.

Au lieu de uniq, vous pouvez également utiliser awk :

awk '!x[$0]++'

Le code ci-dessus est équivalent à uniq.

Ce que vous recherchez, c'est cette commande :

for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done

Contenu de tmp :

anthony@mtt3:~$ cat tmp
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf 

MODIFICATION :

Sortie de la commande :

anthony@mtt3:~$ for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done

cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X