ファイルA.txt:
ATGCATGC
GGGGGGTT
TTTTT
AAAA
ファイルB.txt:
asdfasdf
blah2
ATGCATGC
blah3
blah4
delte-me-too
GGGGGGTT
blah5
blah5
....
FileA.txtの各行を比較してFileB.txtにあることを確認したいと思います。 FileBにいる場合は、以下を削除したいと思います。
一致する線
ライン上
次の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行だけ覚えておく必要があります。