Bash
快速消除跨多個文件的重複行
我有大量數據,其中每條(數據)行都應該是唯一的。
一個文件夾中有很多文件,這已經是正確的。它大約 15GB 分成大約 170 個文件和 1000000 行。我們稱之為文件夾
foo
。現在有第二個文件夾 (
bar
) 包含更多數據:在每個文件中,沒有多個條目。兩個文件的交集bar
不一定是空的。那裡的每個文件大約有 15k 行(其中有數千個文件bar
)。現在我正在使用
awk 'NR==FNR{a[$0]=$0;next}!a[$0]' foo/file bar/file > tmp mv tmp bar/file
以及對所有文件的
foo
循環和對所有文件的循環bar
。foo
如果bar/file
為空,我會中斷循環。我通過鎖定(用於多個節點)和並行執行(在每個節點上)來並行化它。但是,這仍然需要很長時間。提高性能的可能性有哪些?中文件的理想文件大小是
foo
多少?當然,這取決於機器(RAM/CPU/儲存),但這裡有什麼好的經驗法則?tl;dr:
foo
包含唯一的數據線,包含可以在和bar
中多次出現的數據線。消除重複項,以便它們可以合併bar``foo``bar``foo
$$ Update $$沒有空行$$ /Update $$
我不確定我是否理解您的問題,但您的程式碼可以優化為:
awk '!x{a[$0];next}; !($0 in a)' foo/file x=1 bar/file > tmp
(我認為你的空行或解析為“0”的行有問題)
如果文件已排序,您可以執行以下操作:
comm -13 foo/file bar/file > tmp
如果不是(ksh93.zsh 或 bash 語法):
comm -13 <(sort foo/file) <(sort bar/file) > tmp
(不一定比 awk 解決方案快)
此外,尤其是使用 GNU awk,您可以通過將語言環境設置為 C/POSIX 來獲得更好的性能:
LC_ALL=C awk ...