2016-09-23 6 views
-3

J'ai un fichier contenant les chemins de fichiers et les noms de fichiers que je veux trier à partir de la fin de la chaîne.bash trier une liste commençant à la fin de chaque ligne

Mon fichier contient une liste, comme ci-dessous:

/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc 
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc 
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc 
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc 

Je veux trier cette liste de telle sorte que les noms de fichier séquentiel, cela vous aidera à trouver les doublons en fonction de nom de fichier quel que soit chemin.

La liste doit apparaître comme ceci:

/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc 
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc 
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc 
/Volumes/Location/Workers/Charlie/2015-07-06_Charlie_PC/DOCS/4744128.doc 
+1

Avez-vous essayé quoi que ce soit? – Inian

+0

si votre objectif final est de trouver des doublons, cela peut être fait sans avoir à trier – Sundeep

+0

C'est souvent une idée de vérifier les fichiers en double en générant une somme de contrôle MD5 pour chacun et en les exécutant par 'sort | uniq -d' pour trouver du contenu en double, quel que soit le nom de fichier. –

Répondre

2

Voici une façon de le faire:

sed -e 's|^.*/\(.*\)$|\1\t\0|' list.txt | sort | cut -f 2- 

Il utilise sed pour insérer une copie du nom de fichier au début de chaque ligne afin que nous puissions trier la liste avec sort. Ensuite, nous enlevons les choses que nous avons ajoutées dans la première étape.

+2

Pas de manque de respect, mais pourquoi répondez-vous aux questions sans vérifier les tentatives de l'auteur? C'est juste de fournir gratuitement du code sans paye. – Inian

+0

A travaillé comme un charme! Merci beaucoup! – QuePID

+1

@Inian: Nous fournissons du code gratuit et des conseils gratuits, quel que soit l'effort fourni par le PO. Au moins, je ne me souviens pas avoir été payé même lorsque l'auteur a posté ses tentatives. –

1

Ce triera basé sur le dernier champ dynamique qui est séparé par /. D'abord, il ajoutera le dernier champ au début de la ligne, puis sort. Le premier champ qui est ajouté plus tôt est supprimé par le second awk.

awk -F'/' '{ $0= $NF " " $0;print $0 |"sort -k1"}' fil |awk '{print $2}' 
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc 
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc 
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc 
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc 
1

Cela devrait fonctionner:

sort -t/ -k7 input_file 
+1

Seulement si tous les chemins ont le même nombre de segments. Cela va horriblement échouer si vous rencontrez '/ Volumes/Location/Jim/2016-09-23_Jim_PC/DOCS/Personal/1234.doc'. Cela fonctionne sur les données d'échantillon affichées par le PO, mais ce n'est pas une bonne solution générale. –

+0

@JimMischel: OP n'a pas demandé de solution générale. Je préfère suivre [principe KISS] (https://en.wikipedia.org/wiki/KISS_principle). – mouviciel