Bash

快速消除跨多個文件的重複行

  • August 19, 2019

我有大量數據,其中每條(數據)行都應該是唯一的。

一個文件夾中有很多文件,這已經是正確的。它大約 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循環和對所有文件的循環barfoo如果bar/file為空,我會中斷循環。我通過鎖定(用於多個節點)和並行執行(在每個節點上)來並行化它。但是,這仍然需要很長時間。

提高性能的可能性有哪些?中文件的理想文件大小是foo多少?當然,這取決於機器(RAM/CPU/儲存),但這裡有什麼好的經驗法則?

tl;drfoo包含唯一的數據線,包含可以在和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 ...

引用自:https://unix.stackexchange.com/questions/47809