2014-05-05 65 views
0

我有一個關於10Gigs的非常大的文件但是想要根據正則表達式模式將給定的文件分割成更小的文件。目前,我有一個工作的解決方案將非常大的文件分割成更小的文件,但是組織成子目錄

 awk '/<doc/{x="F"++i".xml";}{print > ("sub/"x);close("sub/"x);}' wiki_parsed.xml 

這基於給定的正則表達式文檔的更小的文件和文件夾「子」但是,所有這些文件都保存到目錄子保存它們。結果大約有幾十萬個文件。我希望腳本將文件存儲到子目錄中,每個子目錄遞歸地存儲大約幾百個文件。有什麼建議麼 ?

+1

如何把這麼多的信息到數據庫?如果你真的確定「數十萬個文件」是最好的路線,那麼如何對數據進行一點分析,使用數據元素使子目錄名稱自行記錄。一個簡單但經常使用的案例是根據數據日期製作子目錄,因此您有類似2014/05/05的目錄。祝你好運。 – shellter

回答

4

您可以設置一個閾值,指定您希望在特定目錄中創建多少個文件,並在達到該閾值時創建新的子目錄。

awk ' 
BEGIN { system("mkdir -p sub"++j) } 
/<doc/ { 
    x = "F"++i".txt" 
} 
{ 
    print > ("sub"j"/"x); 
    if(i%5==0) { 
     close("sub"j"/"x); 
     system("mkdir -p sub"++j) 
    } 
} 
END { 
    system ("rmdir sub"j) 
}' file 

看看下面的例子(這將創建後的5個文件已被寫入到一個新的子目錄):

$ seq 20 > file 

$ ls 
file 

$ awk ' 
BEGIN { system("mkdir -p sub"++j) } 
/./ { 
    x = "F"++i".txt" 
} 
{ 
    print > ("sub"j"/"x); 
    if(i%5==0) { 
     close("sub"j"/"x); 
     system("mkdir -p sub"++j) 
    } 
} 
END { 
    system ("rmdir sub"j) 
}' file 

$ ls 
file sub1 sub2 sub3 sub4 

$ ls sub* 
sub1: 
F1.txt F2.txt F3.txt F4.txt F5.txt 

sub2: 
F10.txt F6.txt F7.txt F8.txt F9.txt 

sub3: 
F11.txt F12.txt F13.txt F14.txt F15.txt 

sub4: 
F16.txt F17.txt F18.txt F19.txt F20.txt 

你可以調整awk命令,以滿足您的需求和要求。

+2

+1;重新關閉(...)':它缺少'j'。性能考慮:將'close(...)'調用移動到'if(i%5 ...'分支可能有意義,最大的性能增益來自只調用'system(...)' 'mkdir -p' – mklement0

+1

@ mklement0好點,已經更新瞭解決方案雖然我必須創建一個'END'塊來刪除最後創建的空目錄 –

+2

感謝您的更新;您可以使用單個'如果你在'print'之前放置了'if'語句並且添加了額外的檢查,例如:'if(j == 0 || i%5 == 0){if(j> 0)close() 「sub」j「/」x); system(「mkdir -p sub」++ j)}';另外,假設打印塊在_un_conditionally中執行,則應該初始化'x' – mklement0

0

這只是我想讓它發揮作用的完美方式。

這是我得到它完美地工作

awk 'BEGIN { system("mkdir -p splitted/sub"++j) } 
/<doc/{x="F"++i".xml";}{ 

    if (i%1995==0){ 
    ++i; 
    system("mkdir -p splitted/sub"++j"/"); 
    } 
    else{ 
    print >> ("splitted/sub"j"/"x); 
    close("splitted/sub"j"/"x); 
    } 

}' wiki_parsed.xml 

非常感謝球員

相關問題