3

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

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

文件2 - 在文件 2 中,我只有 ID。

id1
id2

输出

id3 val32 val33 val34

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

4

3 回答 3

3

假设这两个文件是按 id 排序的,那么类似

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

应该这样做。

于 2013-01-02T23:18:20.513 回答
2

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

您可以使用-f选项指定File2包含搜索模式的文件来执行此操作grep

grep -v -f File2 File1 > output

正如@glennjackman 建议的那样:

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

于 2013-01-02T23:15:40.413 回答
2

你可以用 awk 这样做:

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

第一个块从散列中收集file2id h。如果 id 中不存在,最后一部分 ( !h[$1]) 将执行默认块 ( ) 。{ print $0 }file2

于 2013-01-02T23:19:40.640 回答