Regex 将非常大的文件拆分为较小的文件,但组织为子目录
我有一个大约10gig的非常大的文件,但是我想根据regex模式将给定的文件分割成更小的文件。目前我有一个可行的解决方案Regex 将非常大的文件拆分为较小的文件,但组织为子目录,regex,bash,file,shell,awk,Regex,Bash,File,Shell,Awk,我有一个大约10gig的非常大的文件,但是我想根据regex模式将给定的文件分割成更小的文件。目前我有一个可行的解决方案 awk '/<doc/{x="F"++i".xml";}{print > ("sub/"x);close("sub/"x);}' wiki_parsed.xml awk'/(“sub/”x);关闭(“sub/”x);}'wiki_parsed.xml 这将根据给定的regex文档生成较小的文件,并将其保存在文件夹“sub”中,但所有文件都保存在目录
awk '/<doc/{x="F"++i".xml";}{print > ("sub/"x);close("sub/"x);}' wiki_parsed.xml
awk'/(“sub/”x);关闭(“sub/”x);}'wiki_parsed.xml
这将根据给定的regex文档生成较小的文件,并将其保存在文件夹“sub”中,但所有文件都保存在目录sub中。最终,目录sub中的文件约为几十万个。我希望脚本将文件存储到子目录中,每个子目录递归存储大约几百个文件。有什么建议吗?您可以设置要在特定目录中创建多少文件的阈值,并在达到该阈值时创建一个新的子目录
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
您可以调整
awk
命令以满足您的需求 您可以设置要在特定目录中创建多少文件的阈值,并在达到该阈值时创建新的子目录
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
您可以调整
awk
命令以满足您的需求 这正是我想要它发挥作用的完美方式
这是我得到的,它工作得很好
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
awk'BEGIN{system(“mkdir-p splitted/sub”++j)}
/>(“拆分/子“j”/“x”);
关闭(“拆分/分“j”/“x”);
}
}'wiki_parsed.xml
非常感谢各位这正是我想要的完美功能 这是我得到的,它工作得很好
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
awk'BEGIN{system(“mkdir-p splitted/sub”++j)}
/>(“拆分/子“j”/“x”);
关闭(“拆分/分“j”/“x”);
}
}'wiki_parsed.xml
非常感谢各位把这么多信息存入数据库怎么样?如果您真的确定“几十万个文件”是最好的方法,那么对数据进行一点分析,使用数据元素使子目录名称自文档化如何。一个简单但经常使用的情况是按数据日期生成子目录,所以您有一个类似2014/05/05的目录。祝你好运。把这么多信息存入数据库怎么样?如果您真的确定“几十万个文件”是最好的方法,那么对数据进行一点分析,使用数据元素使子目录名称自文档化如何。一个简单但经常使用的情况是按数据日期生成子目录,所以您有一个类似2014/05/05的目录。祝你好运;re
close(…)
:缺少j
。性能注意事项:将close(…)
调用移动到if(i%5…
分支中可能是有意义的。最大的性能增益将来自仅调用系统(…)
在需要时使用mkdir-p
。@mklement0的优点。更新了解决方案。尽管我必须创建END
块来删除上次创建的空目录。感谢更新;您可以使用单个系统()
如果您将if
语句放在打印之前,并添加了额外的检查,例如:if(j==0 | | i%5==0){if(j>0)close(“sub”j”/“x);system(“mkdir-p sub”++j)}
;另外,鉴于打印块是有条件执行的,x
应该被初始化。@mklement0再次获得有效点。我将把它们留在OP上玩。:)
感谢各位提出的建设性意见。这是一个很好的回答。但我现在在运行此代码时出现了太多文件处于打开状态的错误。如果我们能够正确地关闭文件,那将是非常棒的;reclose(…)
:缺少j
。性能注意事项:将close(…)
调用移动到if(i%5…
分支中可能是有意义的。最大的性能增益将来自仅调用系统(…)
在需要时使用mkdir-p
。@mklement0的优点。更新了解决方案。尽管我必须创建END
块来删除上次创建的空目录。感谢更新;您可以使用单个系统()
如果您将if
语句放在打印之前,并添加了额外的检查,例如:if(j==0 | | i%5==0){if(j>0)close(“sub”j”/“x);system(“mkdir-p sub”++j)}
;另外,鉴于打印块是有条件执行的,x
应该被初始化。@mklement0再次获得有效点。我将把它们留在OP上玩。:)
感谢各位提出的建设性意见。这是一个很好的回答。但我现在在运行此代码时出现了太多文件处于打开状态的错误。如果我们能正常关闭这些文件,那就太棒了。