警告

警告

我们需要一个包含以下数字的文件:

0000000000..1000000000

0..1000000000

我们可以在哪里下载这类列表?

示例 1:

000000001
000000002
...
099999999
100000000

示例 2:1 2 ... 999999999 1000000000

如果我搜索 torrent 网站或仅仅通过 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; while true; do tmpbuffer100k=$(seq $var $var2; var=$((var+100000)); var2=$((var2+100000))); echo "$tmpbuffer100k" >> output.txt; done

为了避免写入磁盘,我们将例如 100 000 个数字放入一个变量中,然后将其写入磁盘 - 以使其更快,但它还没有起作用。它只写入第一个范围,1..100000

答案1

这是一个高效的纯 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 GiB! 你真的应该重新考虑你试图解决的任何问题的方法。

答案2

我们先来看看例 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 位长的数字。

相关内容