script - En bash, ¿cómo podría agregar enteros con ceros iniciales y mantener un búfer especificado?
script bash (6)
En Bash versión 4 (usa bash -version) puedes usar la expansión de llaves . Poner un 0
antes de cualquier límite obliga a los números a ser rellenados por ceros
echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
Por ejemplo, quiero contar de 001 a 100. Lo que significa que el búfer cero empezaría con 2, 1, y luego con el tiempo 0 cuando llegue a 100 o más.
ej: 001 002 ... 010 011 ... 098 099 100
Podría hacer esto si los números tuvieran un número predefinido de ceros con printf "% 02d" $ i. Pero eso es estático y no dinámico y no funcionaría en mi ejemplo.
Si necesita rellenar valores hasta un número variable con relleno variable:
$values_count=514;
$padding_width=5;
for i in 0 `seq 1 $(($values_count - 1))`; do printf "%0*d/n" $padding_width $i; done;
Esto imprimirá 00000, 00001, ... 00513. (No encontré ninguna de las respuestas actuales que satisfacen mi necesidad)
Si por estático contra dinámico quiere decir que le gustaría poder usar una variable para el ancho, puede hacer esto:
$ padtowidth=3
$ for i in 0 {8..11} {98..101}; do printf "%0*d/n" $padtowidth $i; done
000
008
009
010
011
098
099
100
101
El asterisco se reemplaza por el valor de la variable a la que corresponde en la lista de argumentos ( $padtowidth
en este caso).
De lo contrario, la única razón por la que su ejemplo no funciona es que usa "2" (quizás como si fuera el relleno máximo para aplicar) cuando debería ser "3" (como en mi ejemplo) ya que ese valor es el total resultante ancho (no el ancho de la almohadilla solamente).
Si su sistema lo tiene, intente con la opción -w
( --equal-width
):
$ seq -s, -w 1 10
01,02,03,04,05,06,07,08,09,10
$ for i in `seq -w 95 105` ; do echo -n " $i" ; done
095 096 097 098 099 100 101 102 103 104 105
# jot is available on FreeBSD, Mac OS X, ...
jot -s " " -w ''%03d'' 5
jot -s " " -w ''%03d'' 10
jot -s " " -w ''%03d'' 50
jot -s " " -w ''%03d'' 100
#!/bin/bash
max=100;
for ((i=1;i<=$max;i++)); do
printf "%0*d/n" ${#max} $i
done
El código anterior rellenará automáticamente sus números con el número correcto de 0 según la cantidad de dígitos que contenga el valor máximo / terminal. Todo lo que necesitas hacer es cambiar la variable max
y se encargará del resto.
Ejemplos:
max = 10
01
02
03
04
05
06
07
08
09
10
max = 100
001
002
003
004
005
006
...
097
098
099
100
max = 1000
0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000