Aqui está minha solução, presumi que você só se importa com quantas palavras correspondem e quantas vezes elas coincidem (por exemplo, "Baby" 5 vezes em ambas as músicas vale 5x mais pontos).
Primeiro:
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
Isso transforma todas as novas linhas em espaços, remove todos os caracteres não alfanuméricos (Commas), remove quaisquer espaços duplos, coloca cada palavra em uma linha separada, classifica-os e remove linhas duplicadas.
Você precisa fazer isso para todas as músicas que deseja comparar e, em segundo lugar:
cat songname1words.txt songname2words.txt | sort | uniq -d | wc -l
Isso lhe dará um número de quantas palavras correspondidas.
Eu tentei alguns exemplos:
Animais do Maroon 5 e Bebê de Justin Bieber compartilham 29 palavras.
Animais do Maroon 5 e Grande Conjuração do Opeth compartilham 10 palavras.
Estes são os resultados esperados.
Além disso, veja como você pode compará-lo com todos os outros arquivos de letras:
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
Onde 'songname1words.txt' é o nome do arquivo com o qual você deseja compará-los.
Isso compara todos os outros arquivos de texto contra este, ignorando-se a si mesmo, depois classifica todos por pontuação, de modo que a correspondência do número 1 esteja no topo.
Ele gera uma saída assim:
29 - bieberwords.txt
10 - opethwords.txt