2017-03-10 9 views
2

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 
+0

"awk 'のようなものです(「awk' END {print(NR> 2)?」「NOT EMPTY」:「EMPTY」) '' – Dan

答えて

1

変更FNR==FNRあなたはそれ以外のGNU AWKまたはFILENAME==ARGV[1]を持っている場合。あなたは、ファイルが空で、それが0に一致する場合、そのファイルをスキップするか、すべてのawkのソリューションをしたいならば、チェックは `NR> 2`と唯一のプロセスであるかどうかを確認するために、` lsの-s`を使用することができます

$ awk --version | head -1 
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2) 

$ awk 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt 
data2 
data3 

$ awk --posix 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt 
data1 
data1 
data2 
data3 

$ awk --posix 'FILENAME==ARGV[1]{hash[$0]; next} !($0 in hash)' filter.txt data.txt 
data2 
data3 
+0

あなたの回答はありがたいですが、上記の解決策はありますが、filter.txtは空ですが、 – user3150037

+0

いいえ、間違った結果を出すことはありません。もう一度やり直してください。 –

+0

もう一度試しましたが、間違った結果が出ました。結果に質問が表示されました。 – user3150037

関連する問題