如何在bash中填充整数序列以使所有宽度相同?

时间:2012-01-09 14:12:19

标签: bash numbers padding

我需要循环一些值,

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

对于$first$last,我需要它具有固定长度5.因此,如果输入为1,我需要在前面添加零,使其变为{{ 1}}。例如,它循环到00001,但长度必须为5.

例如:99999000020004200212等等。

关于我如何做到这一点的任何想法?

13 个答案:

答案 0 :(得分:589)

在您的具体情况下,虽然最简单的方法是使用-f标志seq来使其在输出列表时格式化数字。例如:

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标志将输出存储在另一个变量中:

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

请注意,printf支持的格式与seq略有不同,因此您需要使用%05d代替%05g

答案 1 :(得分:113)

您可以轻松完成

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

答案 2 :(得分:74)

如果序列的结尾具有最大填充长度(例如,如果你想要5位数并且命令是“seq 1 10000”),那么你可以使用seq的“-w”标志 - 它自己添加填充。 / p>

seq -w 1 10

产生

01
02
03
04
05
06
07
08
09
10

答案 3 :(得分:68)

使用带有“%05d”的printf,例如

printf "%05d" 1

答案 4 :(得分:16)

使用printf

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

答案 5 :(得分:11)

像这样使用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

通过这种方式,您可以避免在* nix的所有风格上使用不可用的外部程序seq

答案 6 :(得分:8)

我输出的数字(零)比我需要的更多,然后使用tail只使用我要查找的位数。请注意,您必须使用&#39; 6&#39;在尾巴中得到最后五位数字:)

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

答案 7 :(得分:4)

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

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

输出:

01
02
03
04
05

答案 8 :(得分:1)

这也将起作用:

for i in {0..9}{0..9}{0..9}{0..9}
do
  echo "$i"
done

答案 9 :(得分:1)

其他方式:

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} 

}

答案 10 :(得分:0)

1。)创建一个从1到1000的数字“ seq”序列,并固定宽度“ -w”(宽度由结束数字的长度确定,在这种情况下为1000的4位数字)。

2。)另外,使用'sed -n'选择想要的数字(在这种情况下,我们选择数字1-100)。

3。)“回显”每个数字。数字存储在变量'i'中,可使用'$'访问。

优点:这段代码很干净。

缺点:(据我所知)'seq'不是所有Linux系统都固有的

for i in `seq -w 1 1000 | sed -n '1,100p'`; 
do 
    echo $i; 
done

答案 11 :(得分:0)

如果您只是在用0填充数字以达到固定长度之后,只需将其最接近的10的倍数相加 例如。对于2位数字,加10 ^ 2,然后在显示输出之前删除前1。

此解决方案适用于使用for循环填充/格式化任意长度的单个数字或整个数字序列。

# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf

pad=100000      ;# 5 digit fixed

for i in {0..99999}; do ((j=pad+i))
    echo ${j#?}
done

在Mac OSX 10.6.8,Bash版本3.2.48上测试

答案 12 :(得分:0)

不使用外部进程派生的一种方法是字符串操作,在一般情况下,它看起来像这样:

#start value
CNT=1

for [whatever iterative loop, seq, cat, find...];do
   # number of 0s is at least the amount of decimals needed, simple concatenation
   TEMP="000000$CNT"
   # for example 6 digits zero padded, get the last 6 character of the string
   echo ${TEMP:(-6)}
   # increment, if the for loop doesn't provide the number directly
   TEMP=$(( TEMP + 1 ))
done

这在WSL上也很好用,因为分叉是一项非常繁重的操作。我有一个110000个文件列表,使用printf "%06d" $NUM花费了1分钟,上面的解决方案运行了大约1秒钟。