Suchen Sie nach Duplikaten nach Spalten in einer Datei

Suchen Sie nach Duplikaten nach Spalten in einer Datei

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 md5sumauch 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 STDINoder 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 cutdie MD5-Summe ausliest, sie durchläuft, uniq -cum die Zählungen zu erhalten, sie verwendet, awkum die tatsächlich eindeutigen Werte auszusortieren, und dann die verbleibenden MD5-Summen durch eine forSchleife an grepdie ü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

verwandte Informationen