如何在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
更一般地说, bash
将printf
作为一个内置的,所以你可以填充输出为零,如下所示:
$ 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