2014-02-12 19 views
-1

我試圖採取一個文件的內容和ls的輸出,刪除所有重複(不保留任何),並把它放回來到另一個文件中,減去「ls」的輸出。例如,如果文件 「file.txt的」 載:以兩個輸入,刪除換行符分隔的重複,並返回輸出在bash或java

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 /秒。

如果這不能滿足您的需求,請考慮它是一種理論情況,我仍然需要一次保存最大的硬盤空間(意味着儘可能少的臨時文件),而且RAM一個時間,意思是儘可能少加載一個文件。

回答

1

確保您使用的GNU工具,後來乾脆:

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

這將創建大小等於你輸入的tempory文件,但GNU那種非常聰明,不要用太多的RAM。

運行時間是O(n log n)

+0

所以我忘了提及file.txt的第一行需要保持第一行......哦。我即興創作: ls | sort> ls.txt; head -n 1 file.txt> temp.txt; tail -n +2 file.txt | sort> file.temp; cat temp.txt; comm -23 file.temp ls.txt; rm file.temp ls。txt temp.txt; 如果你能想到一個更好的方式來做到這一點,隨時告訴我! – Roguebantha

0

通常情況下,我會建議通過線建造兩個List<String>各自填充線,並從文件中使用List源自ls申請removeAll()List始發作爲參數,以便僅不存在的文件中被保持的行。

+0

您可能需要解釋更多...代碼示例? – Roguebantha

+0

'列表 fileList = ...; 列表 lsList = ...; 列表 onlyFileList = fileList.removeAll(lsList);' – Smutje

0

這種方式怎麼樣?

相關問題