获取两个输入,删除换行符分隔的重复,并用bash或java返回输出



我试图获取一个文件的内容和ls的输出,删除所有重复(不保留任何重复),并将其放回另一个文件中,减去"ls"的输出。例如,如果文件"file.txt"包含:

hello
world
test
hi
mom

并且"ls"返回:

index
test
worm
folder

我希望输出包含:

hello
world
hi
mom

省略了测试,因为它在ls的输出中。一个主要问题是,你可能会期望ls和file.txt的输出非常大,比如ls的输出有数百万行,甚至可能有数百万行。

我会有那么多行,因为我试图在互联网上找到每一个URL/URI,这是…大型:p

在我开始讨论磁盘空间之前,我计算了一下,计算出了大约600 GB的磁盘空间(因为它只是文本),但我可能错了/错了几TB。

我有几个100 GB的RAM,然而,我仍然想节省尽可能多的RAM。

它将是众包的,所以我们甚至不要进入带宽。无论如何,我有几个GB/s。

如果这还不能让你满意,那就考虑一下理论上的情况,在这种情况下,我仍然需要一次节省最多的硬盘空间(意味着一次尽可能少的临时文件)和一次最多的RAM,也就是说一次加载尽可能小的文件。

确保您使用的是GNU工具,然后简单地:

find . -maxdepth 1 -mindepth 1 -printf '%Pn' | sort > listing.txt
sort file.txt > sortedfile.txt
comm -23 sortedfile.txt listing.txt

这会创建与您的输入大小相等的临时文件,但GNU排序足够聪明,不会使用太多RAM。

运行时为O(n log n)

通常,我建议逐行构建两个List<String>,并使用源自lsList作为参数将removeAll()应用于源自文件的List,以便只保留文件中不存在的行。

这种方式怎么样?

diff <(ls |sort) <(sort file.txt) |awk -F "> " '/>/{print $2}'

相关内容

  • 没有找到相关文章

最新更新