J'ai un fichier d'entrée contenant les chemins de fichiers et leur somme md5, séparés par des points-virgules et triés par hachage md5:
/media/LaCie/Images/recup2/recup_dir.1/f1295328.jpg;0080ececd3da8533f5d11e449cf73287
/media/LaCie/Documents/pics/897_FUJI/DSCF7042.JPG;0081cd15705f0c541995e13ad3e405b8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387
J'aimerais savoir comment je pourrais trouver des doublons basés sur le hachage et les imprimer, pour que la sortie de l'entrée ci-dessus ressemble à ceci:
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387
J'ai essayé uniq
, mais je n'ai pas trouvé comment changer le séparateur de champs d'espaces en points-virgules (certains chemins de fichiers peuvent contenir des espaces)
text-processing
uniq
l0r3nz4cc10
la source
la source
Réponses:
Si vos chemins ne contiennent pas d'espaces ou de points-virgules, il suffit de les transformer en espaces.
Si vos chemins contiennent des espaces mais pas de tabulations ni de points-virgules, vous pouvez faire la même chose, mais transformer temporairement les espaces en points-virgules et utiliser un onglet comme séparateur de champs.
Si vous ne voulez pas faire d'hypothèses sur les noms de fichiers (autres que ne pas contenir de nouvelles lignes), vous pouvez faire en sorte que awk fasse le travail à la place.
la source
La solution possible pourrait être la suivante
awk
:La mise en garde avec ceci est que le fichier est lu deux fois. Lors de la première passe, nous comptons et stockons les répétitions dans un tableau et lors de la deuxième passe, nous imprimons une ligne si le compteur est supérieur à 1.
la source
Assez facile avec
perl
(pour les points de bonus - vous pouvez faire la même chosemd5sum
).Mais quelque chose comme ça:
Remarque
<>
est le descripteur de fichier magique. Il faut des données contenues dans le script viaSTDIN
ou à partir de fichiers en ligne de commande./myscript.pl file_containing_data
la source
Parmi les solutions les plus intelligentes, voici un "one-liner" de force brute qui se trouve
cut
dans le md5sum, l'exécuteuniq -c
pour obtenir les comptes, l'utiliseawk
pour éliminer les valeurs réellement uniques, puis passe les md5sums restants via unefor
boucle auxgrep
valeurs correspondantes à partir du fichier d'origine. Certainement pas aussi élégant que la solution tout-générique de Gilles, et a également le malheur de lire le fichier d'entrée deux fois.J'ai ajouté des doublons supplémentaires à votre exemple de fichier d'entrée:
à laquelle la boucle ci-dessus produit:
la source