Veja uma solução eficiente de Bash:
function print_numbers {
current_num=$1
target_num=$2
target_num_length=${#target_num}
while [ $current_num -le $target_num ]; do
printf "%0${target_num_length}d\n" $current_num
# or just "echo $current_num" if padding is not required
current_num=$((current_num + 1))
done
}
print_numbers 0 10 > target_file
Como ele usa apenas os Bash internos, nenhum processo adicional é criado. Ele abre o arquivo target_file
uma vez e redireciona toda a saída da função para esse arquivo.
A função é anulada automaticamente ao atingir o valor alvo.
Claro que, em comparação com uma ferramenta nativa como seq
, ainda é incrivelmente lenta:
db-nb-13:~ fuzzy$ time print_numbers 0 100000 > /dev/null
real 0m2.909s
user 0m2.761s
sys 0m0.139s
db-nb-13:~ fuzzy$ time print_numbers 0 1000000 > /dev/null
real 0m30.974s
user 0m29.074s
sys 0m1.651s
db-nb-13:~ fuzzy$ time seq -w 0 1000000 > /dev/null
real 0m0.370s
user 0m0.363s
sys 0m0.003s
Aviso
Os arquivos resultantes serão muito grandes. Um arquivo contendo 0..1000000000, preenchido com zeros, terá
1 000 000 000 * (10 (bytes for 10 digits – ASCII!) + 1 (newline)) = 11 000 000 000 bytes
Isso é 10,24 GiB ! Você realmente deve reconsiderar sua abordagem para qualquer problema que esteja tentando resolver.