基于来自另一个的密钥排除文件

时间:2014-08-05 17:49:48

标签: bash

我的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似乎是我想要的,但需要整条线来匹配。有没有更有效的方法来做到这一点?

2 个答案:

答案 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读取下一个密钥,因此只保留一个密钥并立即在内存中排队。