在两个给定的输入文件中搜索公共字符串

时间:2012-01-31 04:03:51

标签: algorithm bash shell awk

我有两个大小为20Gb的文件。我必须在它们中搜索共同的字符串。假设字符串的最大长度为20字节。所以为了解决这个问题,我使用的是以下算法,我使用的是8GB RAM和四核i3 CPU系统。

sort the files using any suitable sorting utility
open files A and B for reading
read wordA from A
read wordB from B
while (A not EOF and B not EOF)
{
    if (wordA < wordB)
        read wordA from A
    else if (wordA > wordB)
        read wordB from B
    else
        /* match found, store it into some other files */
        write wordA into output
        read wordA from A
}

它成功地用于上述系统配置但是当我在6Gb RAM系统中运行此算法并且可用磁盘空间为120GB且具有6核i3处理器时......我的系统被多次关闭了。为什么会这样?

Plz告诉我任何其他方法来解决这个问题!我们可以改善它的表现吗?

1 个答案:

答案 0 :(得分:3)

是的,您可以使用非常短的awk 1-liner

来显着提高性能
awk 'FNR==NR{a[$0]++;next}a[$0]' file1 file2

使用awk,您可以找到唯一的行,而无需先对它们进行排序。你并没有真正说出你想用普通线做什么,所以我只是假设你想打印它们。

如果您只想打印一个公共行一次,无论重复多少次,您都可以使用:

awk 'FNR==NR{a[$0]=1;next}a[$0]-- > 0' file1 file2