Você pode usar csplit
. Ele faz o trabalho bem, exceto que é um pouco inflexível em relação aos nomes dos arquivos de saída (você só pode especificar um prefixo, não um sufixo) e você precisa de um primeiro passo para calcular o número de peças.
csplit -f text -- input.txt '//' "{$(wc -l input.txt)}"
for x in text[0-9]*; do mv -- "$x" "$x.txt"; done
A versão GNU, mas não a versão OSX, possui extensões que resolvem os dois problemas.
csplit -b '%d.txt' -f text -- input.txt '//' '{*}'
Como alternativa, se csplit
for muito inflexível, você pode usar o awk.
awk '{filename = sprintf("text%d.txt", NR); print >filename; close(filename)}' input.txt