2017-05-04 47 views
-1

雖然我不希望第1列中有不同的值,但我不希望引用類似的問題here。例如,來自:根據第一列值將大文件分割成具有一定行數的文件

A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 
B.Y|1|1 
B.Y|1|2 

我想將它分成x個文件,每個文件包含最多5行。在這個例子中,我希望兩個文件:

A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 

B.Y|1|1 
B.Y|1|2 

的awk -F \ | '{print> $ 1}'file1

對於這個例子,我可以通過2個步驟輕鬆達到目標。對於我的真實文件,我想要分割一個大約200Gig的大文件,第一列中有1000萬個唯一值。我希望每個文件都有大約1,000,000行(即靈活的閾值)。由於我無法負擔生成數百萬個文件,因此分兩步做是不可行的。任何想法?

+0

那麼,每個文件有1000萬個獨特的「密鑰」和最多5行,您仍然會得到至少200萬文件。也許如果你讓我們失望了需要做的事情,我們可能會幫助你完成這件事。 –

+0

目前尚不清楚,你寫了*最多包含5行*的文件,但你的第一個輸出包含4行。然後,您*無法承擔生成數百萬個文件*,但您想同時拆分大文件。聽起來不一致 – RomanPerekhrest

+0

對不起,我感到困惑。我再次編輯我的問題。 – Sara

回答

1

雙掃描的文件,你可以做

$ awk -F\| -v size=5 'NR==FNR {a[$1]++; next} 
       FNR==1 || p!=$1 {if(count+a[$1]>=size) {f++; count=0} 
           else count+=a[$1]; p=$1} 
           {print > "_file_"f+0}' file{,} 

$ head _f* 
==> _file_0 <== 
A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 

==> _file_1 <== 
B.Y|1|1 
B.Y|1|2 

不過請注意,如果唯一的密鑰中的一個可以具有比所需的文件長度的多個記錄,非分裂和保持最大文件長度發生衝突。在這個劇本中,我認爲不分裂更重要。例如,對於相同的輸入文件更改,請設置size = 1。這些密鑰不會被分割成單獨的文件,但文件長度將會超過1.

+0

很好,謝謝! – Sara

+0

idk,因爲問題並不清楚,但可能會比讀取200 Gig文件兩次並在內存中存儲1000萬以上的值有更好的解決方案。 btw在輸出重定向的右側使用未經表達的表達式是每個POSIX所以未定義的行爲,所以如果您不調整它到'print>(「_file_」f + 0)''而不是'如果你不使用GNU awk,你也必須添加邏輯來關閉輸出文件,以避免「太多打開文件」的錯誤。 –

相關問題