处理awk文件比较中的空文件

时间:2017-03-10 17:52:41

标签: bash shell awk

我需要从data.txt中找到与filter.txt中的数据不匹配的记录。早些时候,我使用grep -vf filter.txt data.txt,它工作正常,但速度很慢。

根据grep -vf too slow with large files中的讨论,我切换到了

awk 'FNR==NR {hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt

如果filter.txt不为空,则有效。

data.txt中

data1
data2
data3

filter.txt

data1

op.txt

data2
data3

但如果filter.txt为空则失败。如果filter.txt为空,则输出op.txt也为空。理想情况下,它应该等于data.txt。

尝试使用ARGIND == 1。似乎适用于空filter.txt,但对非空filter.txt产生错误的结果。预期的产出在上面。

$ 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

1 个答案:

答案 0 :(得分:1)

如果您有GNU awk或FNR==FNR,请将ARGIND==1更改为FILENAME==ARGV[1]

$ 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