Это чистое решение на awk, которое работает для двух шаблонов на строку (разделенных пробелами) в файле шаблонов с операцией логического И:
awk 'NR==FNR{patts[$1]=$2;next}{for (i in patts) if (($0 ~ i) && ($0 ~ patts[i])) print}' patterns file
Обновление :
Для сопоставления слова вместо регулярного выражения вы можете оценить эту альтернативу:
awk 'NR==FNR{patts[$0]="\\<" $1 "\\>.*\\<" $2 "\\>|\\<" $2 "\\>.*\\<" $1 "\\>";next} \
{for (i in patts) if ($0 ~ patts[i]) print}' patterns file1
Фактически он преобразует шаблон 833 7777
в \ . * \ | \ . * \
, который выполняет сопоставление слов и имитирует также логическое И для двух шаблонов.
Это решение протестировано и не соответствует записям типа G 77771 2833
Обновление №2
Это обеспечит сопоставление слов, операцию логического И и печать для сопоставленных групп с разделительной строкой.
awk 'NR==FNR{patts[$0]="\\<" $1 "\\>.*\\<" $2 "\\>|\\<" $2 "\\>.*\\<" $1 "\\>";next} \
{for (i in patts) {if ($0 ~ patts[i]) !found[i]?found[i]=$0:found[i]=found[i] ORS $0}} \
END{for (k in found) {print found[k];print "-----"}}' patterns file1
#Output
A 833 0 0 0 0 7777 0 0 0 0
F 7777 833
-----
D illicit Jam fox 33333
-----
C the cow jumps over the 311 moon 2222
-----
PS: Из-за awk-способа работы с ассоциативными массивами мы не можем повлиять в секции END на печать найденного массива. Будет как-то «случайным».