ファイルを繰り返して、awk文で各行を新しい正規表現にするにはどうすればよいですか?

ファイルを繰り返して、awk文で各行を新しい正規表現にするにはどうすればよいですか?

ファイルA.txt:

ATGCATGC 
GGGGGGTT
TTTTT
AAAA

ファイルB.txt:

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
....

FileA.txtの各行を比較してFileB.txtにあることを確認したいと思います。 FileBにいる場合は、以下を削除したいと思います。

  1. 一致する線

  2. ライン上

  3. 次の2行

新しいファイルに出力します。

注:FileAには500,000行があります。スキーマをハードコードしない方法でこれを実行したいと思います。

現在、この行を削除することがありますが、FileAを繰り返してこのawk式の新しいパターンを作成するのは混乱しています。

awk '/$VARIABLE_REGEX/{for(x=NR-2;x<=NR+2;x++)d[x];} {a[NR]=$0}
END{for(i=1;i<=NR;i++)
    if(!(i in d))
        print a[i]}' FileB.txt

答え1

注:エラーチェックはありません。また、2番目のファイルの入力が言及されたパターンに正確に従うと仮定します。

awk 'NR== FNR {a[$0] = $0 ; next } {if (!($0 in a)) {b[count++] = $0; } else {count--; if (count > 0) delete b[count];getline;getline; }} END {for (i=0; i<count; i++) print b[i] }' 1 2

1と2を入力してください。

1

ATGCATGC
GGGGGGTT
TTTTT
AAAA

2

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
foo
foo-delete
AAAA
bar-delete
bar-delete
bar-ok

出力

asdfasdf
foo
bar-ok

答え2

次のコードは最適ではありません。ファイルB.txt2回)しかし、より速いことを願っています。アッ

comm --nocheck-order -23 FileB.txt <(grep -B1 -A2 -Ff FileA.txt FileB.txt)

新しいGNU sed試すことができるコマンドe(メモリを節約するため)sed+grep:

sed 'N;h;s/.*\n//;s/.*/grep -xF "&" FileA.txt/e;/./{N;N;d};x;P;D' FileB.txt

答え3

これはあなたのサンプルに適用されます

awk '
    NR==FNR {patt[$0]; next} 
    $0 in patt {getline; getline; getline; prev=$0; next} 
    {print prev; prev=$0} 
    END {print prev}
' fileA.txt fileB.txt 

ファイルAの内容全体をメモリに保存する必要がありますが、ファイルBは一度に1行だけ覚えておく必要があります。

関連情報