как насчет этого:
Вы помещаете свои шаблоны в файл, каждый шаблон в строку, а не в функцию awk.
, например
kent$ cat p.txt
abc
def
foo
xxx
тогда вы можете загрузить файл, и пусть awk сделает соответствующую работу за вас. в конце выведите только те шаблоны, которые соответствуют вашей входной строке:
echo inputString|awk 'NR==FNR{ps[$0]=0;next;}
{for(p in ps)if(match($0,p))ps[p]++;}
END{for(p in ps) if(ps[p]>0)print p" matched"}' p.txt -
Конечно, вы можете заменить «-» на входной файл, если вам нужно.
небольшой тест:
kent$ echo "abcdefoobarblah"|awk 'NR==FNR{ps[$0]=0;next;}{for(p in ps)if(match($0,p))ps[p]++;}END{for(p in ps) if(ps[p]>0)print p" matched"}' p.txt -
def matched
foo matched
abc matched
Итак, шаблон "ххх" не был найден. были напечатаны только def, foo, abc.
Обратите внимание , что скрипт можно оптимизировать и сделать короче. например, сохранить блок END {}, выполнить печать в первом цикле for. тем не менее, он показывает вам мою идею, как это сделать.
РЕДАКТИРОВАТЬ для комментария ОП
Джо, я не видел требования о времени совпадения в твоем вопросе. однако это не сложно достичь. Смотрите тест ниже с вашим примером текста:
kent$ echo "abcabcabcdefoobarblah"|
awk 'NR==FNR{ps[$0]=0;next;}
{for(p in ps){t=$0;ps[p]=gsub(p,"",t);}}
END{for(p in ps) if(ps[p]>0)print p" matched "ps[p]" time(s)"}' p.txt -
выход:
def matched 1 time(s)
foo matched 1 time(s)
abc matched 3 time(s)