Нам нужен файл с номерами в нем:

0000000000..1000000000

а также

0..1000000000

где мы можем скачать такие списки?

Пример № 1:

000000001
000000002
...
099999999
100000000

Пример № 2: 1 2 ... 999999999 1000000000

Если я ищу торрент-сайты или просто Google, я могу найти только файлы, которые содержат ~ 8 цифр, но нам нужно 10.

Мы попытались сгенерировать эти файлы:

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

но на создание файла уйдет целая вечность, даже на более крупной машине. Шутки в сторону..

ОБНОВЛЕНИЕ: Мы пытались использовать: var = 0; var2 = 100000; пока правда; do tmpbuffer100k = $(seq $ var $ var2; var = $((var+100000)); var2 = $((var2+100000))); echo "$ tmpbuffer100k" >> output.txt; сделанный

чтобы избежать записи на диск, мы помещаем, например, 100 000 чисел в переменную, а затем записываем ее на диск - чтобы сделать это быстрее, но она пока не работает. Он продолжает писать только первый диапазон, 1..100000

2 ответа2

4

Давайте сначала проверим решение для примера 2:

В Linux у вас есть seq , например:

seq 099999990 100000000

распечатает этот список:

99999990
99999991
99999992
99999993
99999994
99999995
99999996
99999997
99999998
99999999
100000000

Направьте вывод в файл:

seq 1 100000000 > the_file.txt

Теперь, когда вы понимаете, как работает seq давайте вернемся к примеру 1:

Если вы добавите в seq флаг -f вы можете добавить заполнение к сгенерированной последовательности, например:

seq -f "%05g" 1 10

Добавим дополнение к каждому числу, чтобы отформатировать как 5 цифр:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

В вашем конкретном случае вам нужно будет использовать -f "%010g" чтобы получить 10-значные длинные числа.

4

Вот эффективное решение для 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

Поскольку он использует только встроенные модули Bash, дополнительные процессы не создаются. Он открывает файл target_file один раз и перенаправляет все выходные данные функции в этот файл.

Функция прерывается автоматически при достижении целевого значения.

Конечно, по сравнению с нативным инструментом, таким как seq , он все еще невероятно медленный:

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

Предупреждение

Полученные файлы будут очень большими. Файл, содержащий 0..1000000000, дополненный нулями, будет иметь

1 000 000 000 * (10 (bytes for 10 digits – ASCII!) + 1 (newline)) = 11 000 000 000 bytes

Это 10,24 ГиБ ! Вы действительно должны пересмотреть свой подход к любой проблеме, которую вы пытаетесь решить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .