将极大文件拆分为较小的文件,但组织成子目录

时间:2014-05-05 14:48:03

标签: regex bash file shell awk

我有一个关于10Gigs的非常大的文件但是想要根据正则表达式模式将给定文件拆分成更小的文件。目前我有一个可行的解决方案

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

这会根据给定的正则表达式文档生成较小的文件,并将它们保存在文件夹&#34; sub&#34;但是所有文件都保存在目录sub中。最终大约有几十万个文件。我希望脚本将文件存储到子目录中,递归地存储每个文件中的几百个文件。有什么建议吗?

2 个答案:

答案 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

非常感谢你们