scripts script programacion manejo ejemplos comandos comando caracter cadenas cadena buscar bash shell output-formatting

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