LINUX/C++从第二个文件中删除第一个文件中的字符串

LINUX / C++ Remove strings in first file from the second file

本文关键字:文件 第一个 字符串 删除 第二个 LINUX C++      更新时间:2023-10-16

我正在尝试比较两个字符串文件,并从文件2中删除文件1中的所有内容(如果存在),并将其保存在第三个输出文件中。我本来打算为此写一个c++程序,但我能想到的最好的是O(N^2),Linux中有任何命令可以做到这一点吗?如果没有,用c++做这件事最有效的方法是什么?这些文件在一个中有多达10亿个字符串,在另一个中有1000万个字符串,因此O(N^2)是效率极低的

ex f1你好乔什科里sam登

f2千斤顶乔什乔伊samnedaetc

输出文件:千斤顶乔伊nedaetc

为了明确起见,我并没有试图合并它们然后删除重复项,我只想从文件2中删除文件1中字符串的重复项。感谢

fgrep非常方便:它将为一组固定字符串生成一个文件。

fgrep -f f1 -v f2将打印出f2中未在f1中找到的所有行。

您可以使用Aho-Corasick字符串匹配算法来解决此任务。它用于跨文本的多关键字搜索,其时间复杂性是线性的。

该算法在网络上有一些C++实现。例如这个。

此外,还有一个好看的python库。

但是,我不确定在使用这些源/库时内存的复杂性是否可以。您可能需要从第一个文件中分块读取输入(因为它可能有数十亿个字符)。

您可以编写一个C++(或Ocaml)程序,该程序读取第一个文件的所有单词,并将它们存储在一组字符串中(在C++中使用std::set<std::string>,在Ocaml中使用module SS = Set.Make(String);;)。填充该集合应该是O(n log n)复杂性(其中n是单词的数量,即集合的基数)。测试每个单词属于(或不属于)该集合的m单词的文件是否为O(m log n)

集合被实现为具有对数成员关系测试时间的平衡树。

但是,您可能应该使用一些数据库系统来存储(和填充)数据。(例如PostGreSQL、MariaDB、MongoDB、CouchDB等)