Ich habe eine Eingabedatei mit Dateipfaden und deren MD5-Summe, durch Semikolon getrennt und nach MD5-Hashes sortiert:
/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
Ich würde gerne wissen, wie ich Duplikate auf der Grundlage des Hashs finden und ausdrucken kann, sodass die Ausgabe für die obige Eingabe folgendermaßen aussieht:
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387
Ich habe es versucht uniq
, konnte aber nicht herausfinden, wie ich den Feldtrenner von Leerzeichen in Semikolons ändern kann (einige Dateipfade können Leerzeichen enthalten).
Antwort1
Wenn Ihre Pfade keine Leerzeichen oder Semikolons enthalten, wandeln Sie die Semikolons einfach in Leerzeichen um.
tr ';' ' ' | uniq -f 1 -d | tr ' ' ';'
Wenn Ihre Pfade Leerzeichen, aber keine Tabulatoren oder Semikolons enthalten, können Sie grundsätzlich dasselbe tun – aber Leerzeichen vorübergehend in Semikolons umwandeln und einen Tabulator als Feldtrennzeichen verwenden.
tr '; ' '\t;' | uniq -f 1 -d | tr '\t;' '; '
Wenn Sie keine Annahmen bezüglich der Dateinamen machen möchten (außer, dass sie keine Zeilenumbrüche enthalten), können Sie diese Aufgabe auch von awk erledigen lassen.
awk -F ';' '{
if ($NF == current) {
if (first != "") print first;
first = "";
print;
} else {
first = $0;
current = $NF;
}
}'
Antwort2
Mögliche Lösung könnte Folgendes sein awk
:
awk -F";" 'FNR == NR { x[$2]++; next; } { if ($2 in x && x[$2] > 1) print; }' file file
Der Vorbehalt dabei ist, dass die Datei zweimal gelesen wird. Im ersten Durchgang zählen und speichern wir Wiederholungen im Array und im zweiten Durchgang drucken wir die Zeile, wenn der Zähler größer als 1 ist.
Antwort3
Ziemlich einfach mit perl
(für Bonuspunkte – Sie könnten md5sum
auch das Bit machen).
Aber so etwas wie das hier:
#!/usr/bin/env perl
use strict;
use warnings;
my %file_md5;
while ( <> ){
chomp;
my ( $filename, $hash ) = split /;/;
if ( $file_md5{$hash} ) {
print "$filename has the same md5sum as $file_md5{$hash}\n";
}
$file_md5{$hash} = $filename;
}
Beachten Sie <>
den magischen Dateihandle. Er nimmt Daten entgegen, die entweder über STDIN
oder aus Dateien in der Kommandozeile in das Skript geleitet werden../myscript.pl file_containing_data
Antwort4
Zu den intelligenteren Lösungen gehört ein „Einzeiler“, der mit roher Gewalt cut
die MD5-Summe ausliest, sie durchläuft, uniq -c
um die Zählungen zu erhalten, sie verwendet, awk
um die tatsächlich eindeutigen Werte auszusortieren, und dann die verbleibenden MD5-Summen durch eine for
Schleife an grep
die übereinstimmenden Werte aus der Originaldatei weiterleitet. Sicherlich nicht so elegant wie Gilles‘ reine Awk-Lösung und hat außerdem den Nachteil, dass die Eingabedatei zweimal gelesen wird.
for md5 in $(cut -d\; -f2 inputfile-here | uniq -c | awk '$1 > 1 { print $2 }')
do
grep ";$md5\$" inputfile-here
echo ## gratuitous blank line to separate the duplicates
done
Ich habe Ihrer Beispieleingabedatei zusätzliche Duplikate hinzugefügt:
/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/Documents/Pictures/124_FUJI/DSCF4729-1.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729-2.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387
worauf die obige Schleife Folgendes erzeugt:
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729-1.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729-2.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387