我试图获取一个文件的内容和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>
,并使用源自ls
的List
作为参数将removeAll()
应用于源自文件的List
,以便只保留文件中不存在的行。
这种方式怎么样?
diff <(ls |sort) <(sort file.txt) |awk -F "> " '/>/{print $2}'