sed と awk と一致する grep 文字列と同じ [閉じる]

sed と awk と一致する grep 文字列と同じ [閉じる]

私は現在、一致しないパターンを探している大容量ファイルを扱っています。私はこれを達成するために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と)。baaba

ダミーデータのテスト:

$ 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。)

おすすめ記事