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

C++ LINUX/C++;从第二个文件中删除第一个文件中的字符串,c++,linux,algorithm,C++,Linux,Algorithm,我试图比较两个字符串文件,并从文件2中删除文件1中的所有内容(如果有),然后将其保存在第三个输出文件中。我准备写一个C++程序,但是我能想出的是O(n ^ 2),Linux有什么命令吗?如果不是,用C++做什么最有效的方法?这些文件在一个文件中有多达10亿个字符串,在另一个文件中有1000万个字符串,因此O(N^2)的效率极低 前f1 你好 乔希 科里 山姆 堂 f2 杰克 乔希 乔伊 山姆 内达 等 输出文件: 杰克 乔伊 内达 等 要明确的是,我并没有试图合并它们然后删除重复项,我只希望从文

我试图比较两个字符串文件,并从文件2中删除文件1中的所有内容(如果有),然后将其保存在第三个输出文件中。我准备写一个C++程序,但是我能想出的是O(n ^ 2),Linux有什么命令吗?如果不是,用C++做什么最有效的方法?这些文件在一个文件中有多达10亿个字符串,在另一个文件中有1000万个字符串,因此O(N^2)的效率极低

前f1 你好 乔希 科里 山姆 堂

f2 杰克 乔希 乔伊 山姆 内达 等

输出文件: 杰克 乔伊 内达 等

要明确的是,我并没有试图合并它们然后删除重复项,我只希望从文件2中删除文件1中字符串的重复项。
谢谢

fgrep
非常方便:它将grep一个文件以获得一组固定字符串


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

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


fgrep-f f1-v f2
将打印出
f2
中未在
f1
中找到的所有行
。它用于跨文本的多关键字搜索,其时间复杂度是线性的

<> P.NET上有一些C++实现。比如说

除此之外,还有一个很好看的


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

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

<> P.NET上有一些C++实现。比如说

除此之外,还有一个很好看的

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

> P> >可以编写一个C++(或OCAM)程序,读取第一个文件的所有单词并将它们存储在一组字符串中(使用<代码> STD::C++中的SET/code >,或<代码>模块SS= SET。填充该集合应为O(n logn)复杂度(其中n是字数,即集合的基数)。测试每个单词是否属于该集合的m个单词的文件是O(m logn)

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

但是,您可能应该使用一些数据库系统来存储(和填充)数据。(例如PostgreSQL,MariaDB,MangGDB,CoucDB,…)

< p>可以编写一个C++(或OCAM)程序,读取第一个文件的所有单词并将它们存储在一组字符串中(使用<代码> STD::C++中的SET/code >,或<代码>模块SS= SET。填充该集合应为O(n logn)复杂度(其中n是字数,即集合的基数)。测试每个单词是否属于该集合的m个单词的文件是O(m logn)

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



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

如果文件中有10亿个字符串,那么文本文件可能不是存储这些信息的最佳方式。您建议使用什么格式?使用这些文件的程序几乎需要txt文件。所以我的空间很小。如果一个文件中有10亿个字符串,那么文本文件可能不是存储这些信息的最佳方式。你推荐什么格式?使用这些文件的程序几乎需要txt文件。所以我的空间很小。所以如果我只添加>fil3,它会输出到这个文件中,而不是stdout?因为我不想看到数以百万计的字符串在终端上弹出!由于某种原因,这似乎不能正常工作。执行此操作后,f1有500000个字符串,f2有800000个字符串,输出文件只有1400个字符串。如果f2包含所有f1,那么它仍将剩下大约300000个字符串。如果f1中的某些字符串出现多次,则不会如此。@Tangleman:为了使其正常工作,您可以尝试
-w
-x
选项(匹配整字或整行)。@Tangleman:我无法解释这一点。猜测一下:如果您的一些字符串是多字的,
-x
应该给出正确的结果;如果其中一些包含前导/尾随空格,
-w
是正确的方法;如果同时使用多字空格和尾随空格,您可以尝试使用
sed
对它们进行预处理,以去除尾随空格,然后使用
-x
选项。那么,如果我只添加>fil3,它会将其输出到此文件而不是stdout?因为我不想看到数以百万计的字符串在终端上弹出!由于某种原因,这似乎不能正常工作。执行此操作后,f1有500000个字符串,f2有800000个字符串,输出文件只有1400个字符串。如果f2包含所有f1,那么它仍将剩下大约300000个字符串。如果f1中的某些字符串出现多次,则不会如此。@Tangleman:为了使其正常工作,您可以尝试
-w
-x
选项(匹配整字或整行)。@Tangleman:我无法解释这一点。猜测一下:如果您的一些字符串是多字的,
-x
应该给出正确的结果;如果其中一些包含前导/尾随空格,
-w
是正确的方法;如果同时使用多字空格和尾随空格,您可以尝试使用
sed
对它们进行预处理,以去除尾随空格,然后使用
-x
选项。我觉得这太过分了。@RichardPlunkett,这要看情况而定。如果