使用awk(或其他什么?)的sprintf缓冲区溢出?

问题描述 投票:0回答:1

我有一个非常大的 .mbox(几 GB),我想将其拆分为与电子邮件一样多的文本文件。我按照 Oki Erie Rinaldi 从以下问题中得到的答案:How to split an mbox file into n-MB big chunks using theterminal?

mboxsplit.txt
的内容:

BEGIN{chunk=0;filesize=0;}
    /^From /{
    if(filesize>=40000000){#file size per chunk in byte
        close("chunk_" chunk ".txt");
        filesize=0;
        chunk++;
    }
  }
  {filesize+=length()}
  {print > ("chunk_" chunk ".txt")}

然后在该目录中运行/键入此行(包含 mboxsplit.txt 和 mbox 文件):

  awk -f mboxsplit.txt The_large_mbox_file.mbox

因此我将

mboxsplit.txt
的第三行替换如下:

if(filesize>=0){#file size per chunk in byte

mboxsplit.txt
的最后一行如下:

{print > ("chunk_" sprintf("%04d",chunk) ".txt");}

但是,我得到以下输入

awk:无法打开文件 chunk_0253.txt 输入记录号 924244,文件 The_large_mbox_file.mbox 源代码行号 10

注意,该代码适用于

{print > ("chunk_" sprintf("%03d",chunk) ".txt");}

但不是为了

{print > ("chunk_" sprintf("%04d",chunk) ".txt");}
{print > ("chunk_" sprintf("%05d",chunk) ".txt");}
{print > ("chunk_" sprintf("%06d",chunk) ".txt");}

由于错误编号(

chunk_0253.txt
)中的文件编号接近256,可能与函数
sprintf
溢出有关,或者是其他原因?

awk overflow
1个回答
0
投票

我将

mboxsplit.txt
修改如下,去掉了 `sprintf' 的使用。代码不是很优雅,但它可以工作:

BEGIN{chunk=0;filesize=0;}
    /^From /{
    if(filesize>=0){#file size per chunk in byte
        close("chunk_" chunk_str ".txt");
        filesize=0;
        chunk++;
    }
  }
  {filesize+=length()}
  {
    if((chunk>=0) && (chunk<9)){
      {chunk_str="00000" chunk};
    }
  }
  {
    if((chunk>=10) && (chunk<99)){
      {chunk_str="0000" chunk};
    }
  }
  {
    if((chunk>=100) && (chunk<999)){
      {chunk_str="000" chunk};
    }
  }
  {
    if((chunk>=1000) && (chunk<9999)){
      {chunk_str="00" chunk};
    }
  }
  {
    if((chunk>=10000) && (chunk<99999)){
      {chunk_str="0" chunk};
    }
  }
  {
    if(chunk>=100000){
      {chunk_str= chunk};
    }
  }
{print > ("chunk_" chunk_str ".txt");}

© www.soinside.com 2019 - 2024. All rights reserved.