![sed と awk と一致する grep 文字列と同じ [閉じる]](https://linux33.com/image/185243/sed%20%E3%81%A8%20awk%20%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%20grep%20%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E5%90%8C%E3%81%98%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私は現在、一致しないパターンを探している大容量ファイルを扱っています。私はこれを達成するために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
。)
答え2
GNUを使用すると、grep
次のことができます。
(
export LC_ALL=C
sort -uo patterns.txt patterns.txt # if not already uniqued and sorted in the C locale
grep -oFf patterns.txt large_strings.txt |
sort -u |
comm -13 - patterns.txt > unmatched_patterns
)
理論的には、次を見つけるため、@Kusalanandaの答えよりも遅くなければなりません。みんなパターンの発生回数です。