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”中,但所有文件都保存在目录

我有一个大约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”中,但所有文件都保存在目录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上玩。
:)
感谢各位提出的建设性意见。这是一个很好的回答。但我现在在运行此代码时出现了太多文件处于打开状态的错误。如果我们能够正确地关闭文件,那将是非常棒的;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上玩。
:)
感谢各位提出的建设性意见。这是一个很好的回答。但我现在在运行此代码时出现了太多文件处于打开状态的错误。如果我们能正常关闭这些文件,那就太棒了。