¿Cómo rellenar con ceros una secuencia de números enteros en bash para que todos tengan el mismo ancho?

Resuelto John Marston asked hace 12 años • 16 respuestas

Necesito repetir algunos valores,

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

Para $firsty $last, necesito que tenga una longitud fija de 5. Entonces, si la entrada es 1, necesito agregar ceros delante para que se convierta en 00001. Se repite hasta 99999, por ejemplo, pero la longitud debe ser 5.

Por ejemplo: 00002, 00042, 00212, 12312etc.

¿Alguna idea de cómo puedo hacer eso?

John Marston avatar Jan 09 '12 21:01 John Marston
Aceptado

En su caso específico, sin embargo, probablemente sea más fácil usar la -fbandera para seqque formatee los números a medida que genera la lista. Por ejemplo:

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

producirá el siguiente resultado:

00010
00011
00012
00013
00014
00015

De manera más general, bashtiene printfuna función incorporada para que pueda rellenar la salida con ceros de la siguiente manera:

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

Puede usar la -vbandera para almacenar la salida en otra variable:

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

Tenga en cuenta que printfadmite un formato ligeramente diferente, por seqlo que debe utilizarlo %05den lugar de %05g.

David Webb avatar Jan 09 '2012 14:01 David Webb

Aún más fácil puedes hacerlo

for i in {00001..99999}; do
  echo $i
done
Indie avatar Jul 20 '2013 09:07 Indie

Si el final de la secuencia tiene una longitud máxima de relleno (por ejemplo, si desea 5 dígitos y el comando es seq 1 10000), puede usar -wel indicador para la secuencia: agrega relleno por sí mismo.

seq -w 1 10

produciría

01
02
03
04
05
06
07
08
09
10
m_messiah avatar Dec 12 '2014 04:12 m_messiah