Hier ist meine Lösung, ich nahm an, dass es Ihnen nur wichtig ist, wie viele Wörter übereinstimmen, und nicht so oft, wie oft sie übereinstimmen (z. B. "Baby" 5-mal in beiden Songs ist 5x so viele Punkte wert).
Zuerst:
cat songname.txt | sed ':a;N;$!ba;s/\n/ /g' | tr -cd '[[:alnum:]]\ ' | sed 's#\ \ #\ #g' | sed 's#\ #\n#g' | sort | uniq -i > songnamewords.txt
Dadurch werden alle Zeilenumbrüche in Leerzeichen umgewandelt, alle nicht alphanumerischen Zeichen (Kommas) werden entfernt, doppelte Leerzeichen werden entfernt, jedes Wort wird in eine separate Zeile eingefügt, sortiert und doppelte Zeilen werden entfernt.
Sie müssen dies für alle Songs tun, die Sie vergleichen möchten, und dann zweitens:
cat songname1words.txt songname2words.txt | sort | uniq -d | wc -l
Dies gibt Ihnen eine Anzahl von Wörtern, wie viele Wörter übereinstimmen.
Ich habe ein paar Beispiele ausprobiert:
Maroon 5's Animals und Justin Bieber's Baby teilen 29 Wörter.
Die Tiere von Maroon 5 und Opeths große Beschwörung teilen sich 10 Wörter.
Das sind die Ergebnisse, die Sie erwarten würden.
Und so würden Sie es mit allen anderen Textdateien vergleichen:
a="songname1words.txt" && for f in *; do if [[ "$f" != "$a" ]]; then printf $(cat "$a" "$f" | sort | uniq -d | wc -l) && echo " - $f" | sort; fi; done
Wobei 'songname1words.txt' der Dateiname ist, mit dem Sie alle vergleichen möchten.
Dies vergleicht alle anderen Textdateien mit dieser, überspringt den Vergleich mit sich selbst und sortiert sie dann nach Punktzahl, so dass die Übereinstimmung mit der Nummer 1 ganz oben steht.
Es gibt Ausgabe wie folgt:
29 - bieberwords.txt
10 - opethwords.txt