У меня есть сценарий bash для разделения огромного входного файла — на данный момент он составляет 400 МБ, позже сценарий должен разделить файл размером 4 ГБ.
Ядром этой обработки является следующий 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 столбцов и примерно 2,6 миллиона строк; файл, который сценарий должен будет обрабатывать позже, будет содержать около 30 миллионов строк. Входной файл, который я сейчас использую, должен содержать около 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», который используется для создания условий разделения, имеет размер 3 КБ и содержит 155 строк и 3 столбца, поэтому это не должно создавать никаких проблем для awk. Боюсь, я не могу выдавать фиктивные данные, поскольку данные исходят от компании, в которой я работаю.
Я не вижу, где проблема в коде, любая помощь будет принята с благодарностью.
if (NR > (vBreak[vcount+1]-1))
операторclose(str1)
закрывает файл, но так как имя файла не меняется до следующей итерации, последнийprintf
перенаправляется на все еще исходныйstr1
снова открывает файл - person ewcz   schedule 28.09.2015close
сразу послеprintf
- person ewcz   schedule 28.09.2015Count++;
, вероятно, должно бытьcount++;
. Ваши массивыFAv
иFAh
равны, вы, вероятно, можете немного упростить, используя только один. Если вы хотите использовать GNU awk, вы можете установить macport, а затем GNU awk. - person Renaud Pacalet   schedule 28.09.2015