Oto moje rozwiązanie. Przypuszczałem, że zależy ci tylko na tym, ile słów pasuje raczej do tego, ile razy pasują (np. „Baby” 5 razy w obu utworach jest warte 5 razy więcej punktów).
Pierwszy:
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
To zamienia wszystkie znaki nowej linii w spacje, usuwa wszystkie znaki niealfanumeryczne (przecinki), usuwa wszelkie podwójne spacje, umieszcza każde słowo w oddzielnej linii, sortuje je i usuwa duplikaty linii.
Musisz to zrobić dla wszystkich utworów, które chcesz porównać, a następnie:
cat songname1words.txt songname2words.txt | sort | uniq -d | wc -l
To da ci liczbę dopasowanych słów.
Próbowałem kilku przykładów:
Maroon 5's Animals i Justin Bieber's Baby dzielą 29 słów.
Maroon 5's Animals i Opeth's Grand Conjuration dzielą 10 słów.
Takie są oczekiwane wyniki.
Również tutaj możesz porównać to z innymi plikami tekstowymi:
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
Gdzie „songname1words.txt” to nazwa pliku, z którym chcesz je porównać.
To porównuje wszystkie inne pliki tekstowe z tym jednym, pomijając porównywanie się z samym sobą, następnie sortuje je wszystkie według wyniku, tak że mecz numer 1 jest na górze.
Daje takie wyniki:
29 - bieberwords.txt
10 - opethwords.txt