Вот мое решение, я предположил, что вас волнует только то, сколько слов совпадает, а сколько раз они совпадают (например, «Ребенок» 5 раз в обеих песнях приносит в 5 раз больше очков).
Первый:
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
Это превращает все новые строки в пробелы, удаляет все не алфавитно-цифровые символы (запятые), удаляет любые двойные пробелы, помещает каждое слово в отдельную строку, сортирует их и удаляет повторяющиеся строки.
Вы должны сделать это для всех песен, которые вы хотите сравнить, а затем:
cat songname1words.txt songname2words.txt | sort | uniq -d | wc -l
Это даст вам количество совпадений.
Я попробовал несколько примеров:
Животные Maroon 5 и Baby Джастина Бибера делятся 29 словами.
Maroon 5's Animals и Opeth's Grand Conjuration делятся 10 словами.
Это те результаты, которые вы ожидаете.
Кроме того, вот как вы можете сравнить его со всеми другими файлами песен:
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
Где «songname1words.txt» - это имя файла, с которым вы хотите сравнить их все.
Это сравнивает все другие текстовые файлы с этим, пропуская сравнение себя с самим собой, а затем сортирует их по баллам так, чтобы совпадение с номером 1 было наверху.
Это дает вывод, как это:
29 - bieberwords.txt
10 - opethwords.txt