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