我的file1.txt格式为
key100 3 5 7
key101 2 5 6
key103 1 0 0
key202 3 2 1
key204 0 0 0
其中keyXXX是唯一的(并且它按keyXXX排序)。
然后我在file2.txt中有一个唯一键列表(也已排序)以排除
key100
key200
key202
我是否可以运行bash命令返回file1.txt,其中所有键都排除在file2.txt中?
此示例的输出如下所示:
key101 2 5 6
key103 1 0 0
key204 0 0 0
file1.txt非常大,因此遍历每个file2.txt键并使用grep -v似乎很慢。 comm似乎是我想要的,但需要整条线来匹配。有没有更有效的方法来做到这一点?
答案 0 :(得分:2)
fgrep -v -f FILE2 FILE1 > RETURN.txt
比运行几个grep进程快一点(因为fgrep
搜索固定字符串而不是正则表达式,并且它不会为每个单独的模式行打开文件,就像通过FILE2循环一样)。 / p>
答案 1 :(得分:1)
如果file2.txt
不是非常大,那么awk 'NR==FNR {a[$0]++; next} !($1 in a)' file2.txt file1.txt
应该适合您。
如果是,假设两个文件都在密钥上排序,那么在处理file2.txt
中的行时,应该可以根据需要从file1.txt
读取下一个密钥,因此只保留一个密钥并立即在内存中排队。