data.txtからfilter.txtのデータと一致しないレコードを探す必要があります。以前私はgrep -vf filter.txt data.txt
を使っていましたが、これは正しく動作していましたが、非常に遅いです。awkファイル比較で空ファイルを処理する
私はfilter.txtが空でない場合は動作します
awk 'FNR==NR {hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt
に切り替えgrep -vf too slow with large filesでの議論を1として。
data2
data3
op.txt
data.txtを
data1
data2
data3
filter.txt
data1
しかしfilter.txtが空の場合は失敗します。 filter.txtが空の場合、出力op.txtも空です。理想的には、data.txtと等しくなければなりません。
ARGIND == 1を試しました。空のfilter.txtに対しては動作しますが、空でないfilter.txtに対しては間違った結果が生成されているようです。予想される出力は上記のとおりです。 ARGIND==1
へ
$ cat filter.txt
abc2
$ awk 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt
$ cat op.txt
abc2
abc1
abc2
abc3
$ vi filter.txt
$ cat filter.txt
$ awk 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt
$ cat op.txt
abc1
abc2
abc3
"awk 'のようなものです(「awk' END {print(NR> 2)?」「NOT EMPTY」:「EMPTY」) '' – Dan