Gibt es eine Anwendung zum Suchen ähnlicher Dokumente?

Gibt es eine Anwendung zum Suchen ähnlicher Dokumente?

Gibt es eine gute Software, die Gruppen aus mehreren Dateien findet, die ähnlich sind oder bei denen eine Datei einen Teil einer anderen enthält?

Ich habe ein Verzeichnis mit vielen durcheinandergewürfelten Dateien. Unter den Dateien befinden sich verschiedene Dateiversionen und die Dateinamen sind durcheinander.

Antwort1

Wie wäre es, wenn Sie mit diff zwei Dateien vergleichen, die Zeilen des differenzierten Textes mit „wc -l“ zählen und dann die tatsächlichen Zeilen in beiden verglichenen Dateien zählen? Wenn die Differenzzeilen deutlich kleiner sind als die tatsächlichen Zeilen der Dateien, kann man davon ausgehen, dass die Dateien sich mehr ähneln als nicht. Das ist zumindest ein Anfang.

Hier ist die Idee dessen, was Sie tun würden.NOTIZ:Dies setzt voraus, dass Sie mit nicht-binären Dateien arbeiten

Zuerst möchten Sie die Zeilenanzahl jeder Datei ermitteln:

$ cat <file1> | wc -l
24
$ cat <file2> | wc -l
18
$ cat <file3> | wc -l
25
$ cat <file4> | wc -l
4

Gehen Sie dann das Verzeichnis durch, vergleichen Sie die Dateien mit „diff“ und zählen Sie die Zeilenunterschiede:

$ diff <file1> <file2> | wc -l 
47
$ diff -ib <file1> <file3>  | wc -l
12
$ diff -ib <file1> <file4>  | wc -l
34

Das ist die Grundidee.

Das folgende Skript erledigt dies für Sie (arbeitet im aktuellen Verzeichnis) und gibt jedes Mal ein Echo aus, wenn der Unterschied kleiner ist als die Anzahl der Zeilen in einer der Dateien. Sie können dies ändern, um vorsichtiger zu sein und nur Übereinstimmungen für die Anzahl der unterschiedlichen Zeilen zu finden, die mehr als 10+ kleiner sind als die Zeilennummern der beiden Dateien.

for i in `ls`; do 
  for f in `ls`; do 
    if [ $i != $f ]; then 
      F_LINES=`cat $f | wc -l`; 
      I_LINES=`cat $i | wc -l`; 
      DIFF=`diff -ib $i $f | wc -l`;
      if [ $I_LINES -ge $DIFF ]; then 
        if [ $F_LINES -ge $DIFF ]; then 
          echo "SIMILAR: $i [lines: $I_LINES] - $f [lines: $F_LINES] - # lines different: $DIFF";
        fi;
      fi;
    fi;
  done; 
done

Dieses Skript ist, wie gesagt, nichts Besonderes und könnte erheblich vereinfacht werden, aber ich mache das spontan. Es würde ungefähr so ​​etwas ausgeben (anhand des obigen Testdateibeispiels).

SIMILAR: <file1> [lines: 24] - <file3> [lines: 25] - # lines different: 12
SIMILAR: <file3> [lines: 25] - <file1> [lines: 24] - # lines different: 12

verwandte Informationen