Construa um padrão a partir das listas de palavras. De file1.txt contendo, e. one , un , eins e file2.txt contendo two , deux , zwei , você precisa obter a expressão regular (na sintaxe ERE)
(one|un|eins).*(two|deux|zwei)
Se as listas de palavras não contiverem caracteres especiais em um regex, tudo o que você precisa fazer é substituir as novas linhas por | (o operador “ou”), exceto o final.
words1=$(tr '\n' '|' <file1.txt); words1=${words1%\|}
words2=$(tr '\n' '|' <file2.txt); words2=${words2%\|}
grep -E "($words1).*($words2)"
Se as listas de palavras puderem conter caracteres especiais, será necessário citá-las.
words1=$(<file1.txt tr '\n' '|' | sed 's/[][\().*?+|]/\&/g'); words1=${words1%\|}
words2=$(<file2.txt tr '\n' '|' | sed 's/[][\().*?+|]/\&/g'); words2=${words2%\|}
grep -E "($words1).*($words2)"
Observe que, se você não se importar com a ordem das palavras e aceitar correspondências sobrepostas (por exemplo, aceitar twone como contendo one e two ), tudo o que você precisa é de duas invocações grep:
grep -f file1.txt | grep -f file2.txt