Следующее bash решение должно работать хорошо:
IFS='' read -r header
for ((curr_file_max_rows=1000; 1; curr_file_max_rows*=10)) {
curr_file_name="file_with_${curr_file_max_rows}_rows"
echo "$header" > "$curr_file_name"
for ((curr_file_row_count=0; curr_file_row_count < curr_file_max_rows; curr_file_row_count++)) {
IFS='' read -r row || break 2
echo "$row" >> "$curr_file_name"
}
}
У нас есть первый уровень итерации, который производит количество строк, которые мы собираемся записать для каждого последующего файла. Он генерирует имена файлов и записывает в них заголовок. Это бесконечный l oop, потому что мы не проверяем, сколько строк имеет вход, и поэтому заранее не знаем, сколько файлов мы собираемся записать, поэтому нам придется break
из этого l oop до конца.
Внутри этого l oop мы повторяем второй раз, на этот раз по количеству строк, которые мы собираемся записать в текущий файл. В этом l oop мы пытаемся прочитать строку из входного файла. Если это работает, мы записываем его в текущий выходной файл, если это не так (мы достигли конца ввода), мы break
из двух уровней l oop.
Вы можете попробуйте здесь .