Onde podemos baixar números?

0

Precisamos de um arquivo com os números:

0000000000..1000000000

e

0..1000000000

onde podemos baixar esse tipo de lista?

Exemplo # 1:

000000001
000000002
...
099999999
100000000

Exemplo 2: 1 2 ... 999999999 1000000000

Se eu pesquisar por sites de torrent ou apenas pelo Google, só encontrarei arquivos que contenham ~ 8 dígitos, mas precisamos de 10.

Nós tentamos gerar esses arquivos:

var=0; while true; do var=$((var+1)); echo $var >> sorted-generated-only-numbers-length-from-1-to-10-chars-zero-at-start-too.txt; done

mas levará tempo para gerar o arquivo, mesmo com uma máquina maior. Sério ..

ATUALIZAÇÃO: tentamos usar:     var = 0; var2 = 100000; enquanto verdadeiro; do tmpbuffer100k = $ (seq $ var $ var2; var = $ ((var + 100000)); var2 = $ ((var2 + 100000))); echo "$ tmpbuffer100k" > > output.txt; feito

para evitar gravar no disco, em vez disso, colocamos ex .: 100 000 números em uma variável e depois gravamos em um disco - para torná-lo mais rápido, mas ainda não está funcionando. Ele continua escrevendo apenas o primeiro intervalo, 1.10000

    
por pepite 28.12.2016 / 11:30

2 respostas

4

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.

    
por 28.12.2016 / 13:50
4

Vamos verificar primeiro a solução para o exemplo 2:

No Linux, você tem seq , por exemplo:

seq 099999990 100000000

imprimirá esta lista:

99999990
99999991
99999992
99999993
99999994
99999995
99999996
99999997
99999998
99999999
100000000

Direcione a saída para um arquivo:

seq 1 100000000 > the_file.txt

Agora que você entende como seq funciona, vamos voltar ao exemplo 1 :

Se você adicionar a seq o sinalizador -f , poderá adicionar um preenchimento à sequência gerada, por exemplo:

seq -f "%05g" 1 10

Adicionará um preenchimento a cada número para formatar 5 dígitos:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

Para o seu caso específico, você precisará usar -f "%010g" para alcançar os números longos de 10 dígitos.

    
por 28.12.2016 / 11:54

Tags