我需要循环一些值,
for i in $(seq $first $last)
do
does something here
done
对于$first和$last,我需要它的固定长度为5。所以如果输入是1,我需要在前面加上0,这样它就变成了00001。例如,它循环到99999,但长度必须是5。
例如:00002,00042,00212,12312等等。
你知道我该怎么做吗?
我需要循环一些值,
for i in $(seq $first $last)
do
does something here
done
对于$first和$last,我需要它的固定长度为5。所以如果输入是1,我需要在前面加上0,这样它就变成了00001。例如,它循环到99999,但长度必须是5。
例如:00002,00042,00212,12312等等。
你知道我该怎么做吗?
当前回答
如果你想要N个数字,加10^N并删除第一个数字。
for (( num=100; num<=105; num++ ))
do
echo ${num:1:3}
done
输出:
01
02
03
04
05
其他回答
如果序列的结尾有最大的填充长度(例如,如果你想要5个数字,命令是seq 1 10000),那么你可以为seq使用-w标志-它自己添加填充。
seq -w 1 10
会产生
01
02
03
04
05
06
07
08
09
10
像这样使用awk:
awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}'
输出:
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
更新:
作为纯bash的替代方案,你可以这样做来获得相同的输出:
for i in {1..10}
do
printf "%05d\n" $i
done
通过这种方式,您可以避免使用外部程序seq,该程序在所有*nix版本中都不可用。
博士TL;
$ seq 1 10 | awk '{printf("%05d\n", $1)}'
输入(模式1。慢):
$ seq 1 10 | xargs -n 1 printf "%05d\n"
输入(模式2。快):
$ seq 1 10 | awk '{printf("%05d\n", $1)}'
输出(每种情况下的结果相同):
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
解释
我想建议以上的模式。这些实现可以作为命令使用,以便我们可以轻松地再次使用它们。在这些命令中,您需要关心的是转换后的数字的长度。(比如把数字%05d改成%09d。)另外,它也适用于其他解决方案,如以下。这个示例太依赖于我的环境,所以您的输出可能不同,但我认为您可以很容易地看出它的有用性。
$ wc -l * | awk '{printf("%05d\n", $1)}'
00007
00001
00001
00001
00013
00017
00001
00001
00001
00043
就像这样:
$ wc -l * | awk '{printf("%05d\n", $1)}' | sort | uniq
00001
00007
00013
00017
00043
此外,如果以这种方式编写,我们还可以异步执行命令。(我找到了一篇不错的文章: https://www.dataart.com/en/blog/linux-pipes-tips-tricks)
免责声明:我不确定这一点,我不是*nix专家。
性能测试:
超级慢:
$ time seq 1 1000 | xargs -n 1 printf "%09d\n" > test
seq 1 1000 0.00s user 0.00s system 48% cpu 0.008 total
xargs -n 1 printf "%09d\n" > test 1.14s user 2.17s system 84% cpu 3.929 total
相对速度:
for i in {1..1000}
do
printf "%09d\n" $i
done
$ time sh k.sh > test
sh k.sh > test 0.01s user 0.01s system 74% cpu 0.021 total
for i in {1..1000000}
do
printf "%09d\n" $i
done
$ time sh k.sh > test
sh k.sh > test 7.10s user 1.52s system 99% cpu 8.669 total
快速:
$ time seq 1 1000 | awk '{printf("%09d\n", $1)}' > test
seq 1 1000 0.00s user 0.00s system 47% cpu 0.008 total
awk '{printf("%09d\n", $1)}' > test 0.00s user 0.00s system 52% cpu 0.009 total
$ time seq 1 1000000 | awk '{printf("%09d\n", $1)}' > test
seq 1 1000000 0.27s user 0.00s system 28% cpu 0.927 total
awk '{printf("%09d\n", $1)}' > test 0.92s user 0.01s system 99% cpu 0.937 total
如果必须实现更高性能的解决方案,可能需要其他技术,而不是使用shell脚本。
你可以做得更简单
for i in {00001..99999}; do
echo $i
done
其他方式:
zeroos="000"
echo
for num in {99..105};do
echo ${zeroos:${#num}:${#zeroos}}${num}
done
转换任何数字的简单函数是:
function leading_zero(){
local num=$1
local zeroos=00000
echo ${zeroos:${#num}:${#zeroos}}${num}
}