我有一个关于10Gigs的非常大的文件但是想要根据正则表达式模式将给定文件拆分成更小的文件。目前我有一个可行的解决方案
awk '/<doc/{x="F"++i".xml";}{print > ("sub/"x);close("sub/"x);}' wiki_parsed.xml
这会根据给定的正则表达式文档生成较小的文件,并将它们保存在文件夹&#34; sub&#34;但是所有文件都保存在目录sub中。最终大约有几十万个文件。我希望脚本将文件存储到子目录中,递归地存储每个文件中的几百个文件。有什么建议吗?
答案 0 :(得分: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
命令以满足您的需求和要求。
答案 1 :(得分: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
非常感谢你们