如何在bash中填充一个整数序列,使所有宽度都相同?

我需要循环一些值,

for i in $(seq $first $last) do does something here done 

对于$first$last ,我需要它是固定的长度5.所以如果input是1 ,我需要在前面添加零,使它变成00001 。 例如,它循环到99999 ,但长度必须是5。

例如: 00212等等。

任何想法,我怎么能做到这一点?

在你的具体情况下,尽pipe最简单的方法是使用-f标志来让它在输出列表时格式化数字。 例如:

 for i in $(seq -f "%05g" 10 15) do echo $i done 

会产生以下输出:

 00010 00011 00012 00013 00014 00015 

更一般地说, bashprintf作为一个内置的,所以你可以填充输出为零,如下所示:

 $ i=99 $ printf "%05d\n" $i 00099 

您可以使用-v标志将输出存储在另一个variables中:

 $ i=99 $ printf -vj "%05d" $i $ echo $j 00099 

请注意, printf支持与seq稍微不同的格式,因此您需要使用%05d而不是%05g

更容易,你可以做

 for i in {00001..99999}; do echo $i done 

使用printf与“%05d”例如

 printf "%05d" 1 

如果序列的末尾有最大的填充长度(例如,如果你想要5位数字,命令是“seq 1 10000”),那么你可以使用“-w”标志作为seq – 它会增加填充本身。

 seq -w 1 10 

生产

 01 02 03 04 05 06 07 08 09 10 

使用printf非常简单

 [jaypal:~/Temp] printf "%05d\n" 1 00001 [jaypal:~/Temp] printf "%05d\n" 2 00002 

像这样使用awk:

 awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}' 

OUTPUT:

 00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 

更新:

作为纯bash替代品,你可以做到这一点,以获得相同的输出:

 for i in {1..10} do printf "%05d\n" $i done 

这样你就可以避免使用一个外部程序seq ,而这个程序并不适用于所有的* nix。

我用更多的数字(零)填充输出比我需要然后使用尾巴只使用我正在寻找的数字位数。 请注意,您必须在尾部使用“6”来获取最后五位数字:)

 for i in $(seq 1 10) do RESULT=$(echo 00000$i | tail -c 6) echo $RESULT done 

如果您需要N位数字,请添加10 ^ N并删除第一位数字。

 for (( num=100; num<=105; num++ )) do echo ${num:1:3} done 

输出:

 01 02 03 04 05