Bash – sorting des noms de fichiers en fonction de plusieurs champs

J’ai une collection de fichiers tels que

fa_1_se-1.xml fa_1_se-2.xml fa_1_se-3.xml fa_1_se-10.xml fa_2_se-1.xml fa_2_se-2.xml fa_2_se-12.xml 

où le nombre après le trait de soulignement indique le person_id et le nombre après le trait d’union est le record_id.

J’essaie de les sortinger par person_id en premier et ensuite record_id sans succès.

ls | sort -t- -k2 ls | sort -t- -k2 donne

 f_a_1_se-1.xml f_a_2_se-1.xml f_a_1_se-10.xml f_a_2_se-12.xml f_a_1_se-2.xml f_a_2_se-2.xml f_a_1_se-3.xml 

Comment puis-je le faire sortinger par person_id puis record_id?

Merci!

Vous pouvez utiliser l’option --stable :

 sort --stable -t_ -nk2 file fa_1_se-1.xml fa_1_se-2.xml fa_1_se-3.xml fa_1_se-10.xml fa_2_se-1.xml fa_2_se-2.xml fa_2_se-12.xml 

MODIFIER:

Vous pouvez également essayer:

 printf "%s\n" fa* | tr '-' '_' | sort -t_ -nk2 -nk4 | sed 's/_\([^_]*\)$/-\1/' 

Pour les données qui ne sont pas présélectionnées de quelque manière que ce soit, une méthode est un sorting d’étiquette, sortingée par balises:

 awk -F '[_-\.]' '{print $2, $4, $0}' filename | sort -k1n -k2n | awk '{print $3}' 

où nom de fichier a une liste. La réponse de @anubhava semble correcte pour moi. Cet exemple n’est qu’un complément.