我们需要一个包含以下数字的文件:
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 位长的数字。