一度に複数のパターンを効率的に照合しようとしていますが、これは原則として非常にうまく機能します。
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
入力データは2 つの一致するレコード(標準の区切り文字を指定)になりますが、パターン "abc" および "xyz" を使用すると、データ全体で 4 つの一致が得られるためです。この投稿の最初のサンプルでは、少なくとも3 つの一致が報告されていますが、最初のレコードで「abc」が複数回出現していることを検出できません。