Я пытаюсь эффективно сопоставлять несколько шаблонов одновременно, что в принципе работает очень хорошо:
echo abcdef | awk \
'/abc/ {print "match abc"}
/def/ {print "match def"}'
Кроме того, я хочу сопоставить все вхождения в записи:
echo abcabc | awk \
'function findall(str, re) {
while(match(str, re)) {
print "match", re;
str = substr(str, RSTART+RLENGTH)
}
}
{
findall($0, "abc");
}'
Теперь, чтобы расширить приведенный выше пример, чтобы он соответствовал нескольким шаблонам, я бы закончил серию вызовов findall:
findall($0, "abc");
...
findall($0, "def");
Проблема в том, что при множестве разных шаблонов (>100) этот подход не работает так же хорошо, как первый пример. Что имеет смысл, поскольку я думаю, что шаблон не попадает в один и тот же автомат.
Есть ли способ немного ускорить процесс? например обеспечение «совпадения» с несколькими шаблонами. Думаю, я мог бы соединить шаблоны (abc|def), но тогда я потерял бы информацию о том, какой именно шаблон совпал.
Обновление: каждое вхождение должно быть сопоставлено:
abcabc
123
abcxyz
поскольку входные данные приводят к двум совпадающим записям (учитывая стандартный разделитель), но четырём совпадениям во всех данных при использовании с шаблонами "abc" и "xyz". Первый образец в этом посте сообщает как минимум 3 совпадения, но не обнаруживает несколько вхождений "abc" в первой записи.