打印Unix中两个大文件不常见的行的最佳方法

时间:2013-01-02 23:13:02

标签: linux unix awk

我有两个文件格式如下 文件1: - 它包含4列。第一个字段是文本格式的ID,其余列也是一些文本值。

id1 val12 val13 val14
id2 val22 val23 val24
id3 val32 val33 val34

File2 - 在文件二中我只有ID。

id1
id2

输出

id3 val32 val33 val34

我的问题是:如何从第一个文件中查找其ID(第一个字段)未出现在第二个文件中的行。这两个文件的大小非常大,file1包含4200万行,大小为8GB,file2包含3300万个ID。两个文件中的ID顺序可能不同。

3 个答案:

答案 0 :(得分:3)

假设这两个文件按id排序,那么就像

join "-t " -j 1 -v 1 file1 file2

应该这样做。

答案 1 :(得分:2)

我并不认为这是“最好”的方式,因为最好的方法可以包括一些权衡标准,但这是一种方式:

您可以使用-f选项指定File2作为包含grep搜索模式的文件:

grep -v -f File2 File1 > output

正如@glennjackman建议的那样:

  

强制ID在行首开始匹配的一种方法:grep -vf <(sed 's/^/^/' File2) File1

答案 2 :(得分:2)

你可以用awk这样做:

awk 'FNR == NR { h[$1] = 1; next } !h[$1]' file2 file1

第一个块将file2中的id收集到h哈希中。如果!h[$1]中没有id,则最后一部分({ print $0 })执行默认块(file2)。