scripts script programas pasar parametros operaciones manejo ejemplos comando cadenas aritmeticas bash numbers padding

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



scripts bash ejemplos (10)

Necesito bucear algunos valores,

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

Para $first y $last , necesito que sea de longitud fija 5. Entonces, si la entrada es 1 , necesito agregar ceros al frente para que se convierta en 00001 . Se desplaza hasta 99999 por ejemplo, pero la longitud debe ser 5.

Por ejemplo: 00002 , 00042 , 00212 , 012312 y así sucesivamente.

¿Alguna idea de cómo puedo hacer eso?


En su caso específico, aunque es probable que sea más fácil usar el indicador -f para seq formato de los números a medida que sale de la lista. Por ejemplo:

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

producirá la siguiente salida:

00010 00011 00012 00013 00014 00015

De manera más general, bash tiene printf como una función integrada 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 la salida en otra variable:

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

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


Esto funcionará también:

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


Más fácil aún puedes hacer

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


Muy simple usando printf

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


Otra manera :

zeroos="000" echo for num in {99..105};do echo ${zeroos:${#num}:${#zeroos}}${num} done

Una función tan simple para convertir cualquier número sería:

function leading_zero(){ local num=$1 local zeroos=00000 echo ${zeroos:${#num}:${#zeroos}}${num} }


Relleno la salida con más dígitos (ceros) de los que necesito, luego uso la cola para usar solo el número de dígitos que estoy buscando. Observe 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 desea N dígitos, agregue 10 ^ N y borre el primer dígito.

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

Salida:

01 02 03 04 05


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 el indicador "-w" para seq - agrega el propio relleno.

seq -w 1 10

Produce

01 02 03 04 05 06 07 08 09 10


Utilice awk de esta manera:

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 bash pura, puedes hacer esto para obtener la misma salida:

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

De esta manera, puede evitar el uso de una secuencia de programas externa que NO está disponible en todos los sabores de * nix.


use printf con "% 05d" por ejemplo

printf "%05d" 1