私は現在、一致しないパターンを探している大容量ファイルを扱っています。私はこれを達成するためにgrepを使用しています。何らかの理由で、grepは潜在的な矛盾パターンを無視/除外します。パターンファイルと文字列ファイルはどちらも16進文字で構成されています。約200,000個のパターンがあり、各パターンの長さは12〜500文字、13,000個の文字列(各文字列の長さは2,880,560文字)です。次のコマンドを使用しています。
grep -oFf patterns.txt large_strings.txt | grep -vFf - patterns.txt > unmatched_patterns.txt
上記のコマンドは、最初に一致するパターンをすべて抽出し、一致したパターンのうち一致しないパターンをテキストファイルとして保存します。これを模倣するのに対応するsedまたはawkコマンドはありますか? 2台の異なるコンピュータ(私の個人用コンピュータとクラスタ)を使用して上記のgrepコマンドを試しましたが、結果は同じでした。
実行して、getconf ARG_MAX
クラスタに対して次のような出力を得ました。
4611686018427387903
一致しないパターンのいくつかの例は次のとおりです。
fffbfefffffefffffffffffefffffffffffefffffffffffefffffffffffefffffffffffefffffffffffefffffffffffefffffefffffefffffefffffefffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffff
1d2a0e1d2a101c290f1b280e1a270d18250b17240a17230b16220a16220a15210915210916220a16220c19220d1b230e1b230e1b230e1c240d1c240d1c240d1c240d1b250c1c260d1c26
fefffffefffffffffffffffffffdfffffffffffdfeff
2つの文字列で構成される大きな文字列のサンプルファイルは、以下のリンクにあります。 https://www.mediafire.com/file/b1plp74uztkicyr/large_strings.txt/file
ベストアンサー1
、を使用して、awk
すべてのパターンを連想配列のキーとして読み込みます。次に、データファイルを1行ずつ調べ、残りのパターンを各行についてテストします。パターンが一致すると、連想配列から削除されます。
最後に一致しないパターンが出力されます。
NR == FNR { pat[$0] = 1; next }
{
for (p in pat)
if (index($0,p) != 0)
delete pat[p]
}
END {
for (p in pat)
print p
}
たとえば、ファイルに保存してscript.awk
実行できます。
awk -f script.awk patterns.txt large_strings.txt >unmatched_patterns.txt
これは、文字列比較を実行するためにindex()
正規表現マッチング(例:使用)の代わりに使用しますgrep -F
が、データの重複位置で複数のパターン文字列をマッチングすることができます。私の考えではそうしません(grep
パターンab
と)。ba
aba
ダミーデータのテスト:
$ cat patterns.txt
a
b
c
d
$ cat strings.txt
abba
bull
cooler
$ awk -f script.awk patterns.txt strings.txt
d
d
(ファイルに対応する文字列が見つかりませんstrings.txt
。)