awk '{print $NF,$0}' file | sort | cut -f2- -d' '
En gros, cette commande fait :
- Répéter le dernier champ au début, séparé par un espace (OFS par défaut)
- Trier, résoudre les noms de fichiers en double en utilisant le chemin complet ($0) pour le tri
- Couper le premier champ répété, f2- signifie du deuxième champ au dernier
Une ligne en perl pour inverser l'ordre des champs dans une ligne :
perl -lne 'print join " ", reverse split / /'
Vous pouvez l'utiliser une fois, diriger la sortie pour trier, puis la rediriger et vous obtiendrez ce que vous voulez. Vous pouvez modifier / /
à / +/
donc ça comprime les espaces. Et vous êtes bien sûr libre d'utiliser l'expression régulière de votre choix pour diviser les lignes.
quelque chose comme ça
awk '{print $NF"|"$0}' file | sort -t"|" -k1 | awk -F"|" '{print $NF }'
Voici une ligne de commande Perl (notez que votre shell peut vous demander d'échapper le $
s):
perl -e "print sort {(split '/', $a)[-1] <=> (split '/', $b)[-1]} <>"
Il suffit de diriger la liste dedans ou, si la liste est dans un fichier, de mettre le nom du fichier à la fin de la ligne de commande.
Notez que ce script ne modifie pas réellement les données, vous n'avez donc pas à faire attention au délimiteur que vous utilisez.
Voici un exemple de sortie :
>perl -e "print sort {(split '/', $a)[-1] <=> (split '/', $b)[-1]} " files.txt /a/e/f/g/h/01-do-this-first /a/b/c/10-foo /a/b/c/20-bar /a/d/30-bob /a/b/c/50-baz /a/e/f/g/h/99-local