grep - 最大パターン数

grep - 最大パターン数

クロスワード検索のためにPHPでgrepを使用したいと思います。 600,000行の単一の単語(ドイツ語の単語)を含む単語のリストがあります。

7文字(ABCDEFGなど)を入力し、それを使用して5040のすべての順列を作成し(7です!)、ほとんど意味のないすべてのスペルを変更する可能性(ABCDEFG、ABCDEGF、ABCDGEFなど)を入力して単語が存在することを確認したい。私のリストに。

私は16GBのRAM、PHP 8.0、Apache 2.4を搭載したUbuntu 22.04サーバーで動作しています。

これは、5040のスペル置換単語をすべてパターンとして追加する最良の方法ですか?たとえば、

shell_exec( 'grep "^ABCDEFG$\|^ABCDEGF$\|..." /path/to/wordlist.txt');

これは良い習慣ですか?それともfor nextループを使用して5040 grep呼び出しを行い、常に1つのパターンしか持たない方が良いですか?

grepは私が好きなだけ多くのパターンを取ることができることを読んだが、私の方法と同じくらい多くのパターンを持つコードを見つけることができませんでした。サーバーのパフォーマンスによって最大値が制限されると思われますが、まだテストしていません。サーバーの速度を遅くしたくありません。

それとも私のアプローチはあまり良くないので、ベストプラクティスは全く異なるのでしょうか?

私はsqliteを使用し、sqliteデータベースの単語リストを試しましたが(各単語にORを使用)、時間がかかりすぎて不可能です。

ヒントありがとうございます。

ベストアンサー1

スペル置換は文字の順序に興味がないため、これを無視するのが合理的かもしれません。代わりに、テスト中の単語の各文字数を数えるか、単語の文字を簡単に並べ替えます。計算またはソートされた文字列が、計算またはソートされたキー文字列のバージョンと一致する場合は、スペル置換単語があります。

Perlで簡単な1行のソリューションを書くことができます。次の入力ファイルをインポートします。

% cat test.txt
manbat
bantam
hello

これにより、ソート後に「aabmnt」を含む行が印刷されます。

% perl -lne 'chomp; print if join("", sort split //, $_) eq "aabmnt"' test.txt
manbat
bantam

join("", sort split //, $_)現在の行を取得し、$_文字を分割して並べ替えてから再接続します。

あるいは、より便利には、スクリプトでキーワードをソートして、検索キーワードが環境を通過するbatmanスペル置換語を提供する必要があります。

% key=batman perl -lne 'chomp; print if join("", sort split //, $_) eq join("", sort split //, $ENV{key})' test.txt
manbat
bantam

おすすめ記事