¿Cómo poner a cero una secuencia de enteros en bash para que todos tengan el mismo ancho?

Necesito recorrer algunos valores,

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

Para $first y $last , necesito que sea de longitud fija 5. Por lo tanto, si la entrada es 1 , necesito agregar ceros por delante para que se convierta en 00001 . Bucles hasta 99999 por ejemplo, pero la longitud tiene que ser 5.

Ejemplo: 00002 , 00042 , 00212 , 012312 , etc.

¿Alguna idea sobre cómo puedo hacer eso?

En su caso específico, aunque probablemente sea más fácil usar el -f para seq para obtener el formato de 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, bash tiene printf como un built-in para que pueda rellenar la salida con ceros de la siguiente manera:

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

Puede usar el indicador -v para almacenar el resultado en otra variable:

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

Tenga en cuenta que printf admite un formato ligeramente diferente a seq por lo que debe usar %05d lugar de %05g .

Más fácil todavía puedes hacer

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

use printf con “% 05d”, por ej.

 printf "%05d" 1 

Si el final de la secuencia tiene una longitud máxima de relleno (por ejemplo, si desea 5 dígitos y el comando es “1, 1 10000”), entonces puede usar el indicador “-w” para seq, sino que agrega relleno.

 seq -w 1 10 

Produce

 01 02 03 04 05 06 07 08 09 10 

Muy simple usando printf

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

Use awk así:

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

SALIDA:

 00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 

Actualizar:

Como alternativa pura de bash puedes hacer esto para obtener el mismo resultado:

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

De esta forma puede evitar el uso de un progtwig externo que NO está disponible en todos los sabores de * nix.

Rellene la salida con más dígitos (ceros) de los que necesito y uso la cola para usar solo la cantidad de dígitos que estoy buscando. Tenga en cuenta que tiene que usar ‘6’ en la cola para obtener los últimos cinco dígitos 🙂

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

Si quiere N dígitos, agregue 10 ^ N y elimine el primer dígito.

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

Salida:

 01 02 03 04 05 

Esto funcionará también:

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