我有一个bash脚本用于分割一个巨大的输入文件 - 目前它是400MB,之后脚本应该分割一个4GB的文件。
核心或此处理是以下awk脚本:
INPUTFILE="FA.txt"
awk -F $'\t' 'BEGIN{
count = 1;
vcount = 1;
hcount = 1;
tmp = 0;
while (getline "'"$INPUTFILE"'")
{
FAv[count] = $1;
FAh[count] = FAv[count];
BK[count] = $2;
vBreak[count] = $3;
Count++;
}
close("'"$INPUTFILE"'");
}
{
str1 = sprintf("%s%s%s",FAv[vcount],"v",".txt");
str2 = sprintf("%s%s%s",FAh[hcount],"h",".txt");
if (NR > (vBreak[vcount+1]-1))
{
close(str1);
vcount ++;
}
if (($22-tmp) > BK[hcount])
{
close(str2);
tmp = BK[hcount];
hcount++;
}
printf "...\n",(many columns) >> str1;
printf "...\n",(many columns) >> str2;
}' Data.txt
Data.txt是一个非常大的制表符分隔表,有大约40列和大约260万行;脚本稍后应该处理的文件将有大约3000万行。我现在使用的输入文件应该可以生成大约300个文件,脚本稍后要处理的文件应该创建大约4000个文件。
行close(str1);
和close(str2);
不会更改我收到的错误消息
awk: (filename)h.txt makes too many open files
Input record number 157762, file Data.txt
source line number 7
awk: (filename)h.txt make too many open files
Input record number 157762, file Data.txt
source line number 10
给出的源代码行数在这里的给定代码段中相当于它们,在我的脚本中它们位于不同的位置。
用于生成拆分条件的文件“FA.txt”大3KB,有155行和3列,所以这对awk完全没有任何问题。 由于数据来自我正在为之工作的公司,我恐怕无法真正提供虚拟数据。
我没有看到代码中的问题所在,任何帮助都会非常感激。