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. Entonces, si la entrada es 1
, necesito agregar ceros al frente para que se convierta 00001
. Se repite 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?
for variable in $(something to generate the numbers); do ...
pero esto es problemático cuando la lista de números es larga. Es mucho más eficiente de usarsomething to generate the numbers | while read -r variable; do ...
. Consulte también mywiki.wooledge.org/DontReadLinesWithFor, que analiza la lectura de líneas de archivos, etc., pero algunos de los argumentos también se aplican aquí.Respuestas:
En su caso específico, aunque probablemente sea más fácil usar el
-f
indicadorseq
para formatear los números a medida que genera la lista. Por ejemplo:producirá el siguiente resultado:
En términos más generales,
bash
tieneprintf
una función integrada para que pueda rellenar la salida con ceros de la siguiente manera:Puede usar la
-v
bandera para almacenar la salida en otra variable:Tenga en cuenta que
printf
admite un formato ligeramente diferente alseq
que necesita usar en%05d
lugar de%05g
.fuente
%05g
en lugar de%05d
arreglarlo para mí "00026" me estaba dando "00022" . ¡Gracias!seq
admite un subconjunto de caracteres de formato. queprintf
admite (y que los subconjuntos incluyeng
, pero nod
). El comportamiento de los caracteresd
yg
difiere sutilmente en qued
interpreta las0
cadenas de números prefijadas como números octales y los convierte a decimales, mientras que losg
trata como decimales. (@EdManet: por eso '00026' se convirtió en '00022' cond
). Otra cosa vale la pena mencionar:seq -w
hace automática relleno con ceros de los números de salida en función del número más amplia generada.for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txt
produjo una lista hexadecimal de 8 caracteres. Gracias.seq --help
: "FORMATO debe ser adecuado para imprimir un argumento de tipo 'doble'; el valor predeterminado es% .PRECf si FIRST, INCREMENT y LAST son números decimales de punto fijo con PREC de máxima precisión, y% g en caso contrario". Los posibles especificadores de conversión sonefgaEFGA
.Más fácil aún puedes hacer
fuente
4.4.23(1)-release
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"), entonces puede usar el indicador "-w" para la secuencia: agrega el relleno mismo.
Produce
fuente
use printf con "% 05d" ej.
fuente
Muy simple usando
printf
fuente
Use awk así:
SALIDA:
Actualizar:
Como alternativa de bash puro, puede hacer esto para obtener el mismo resultado:
De esta manera, puede evitar el uso de un programa externo
seq
que NO está disponible en todos los sabores de * nix.fuente
awk's
BEGIN
declaración para no tener que usar laheredoc
tarea.Relleno la salida con más dígitos (ceros) de los que necesito, luego uso tail para usar solo la cantidad de dígitos que estoy buscando. Tenga en cuenta que debe usar '6' en la cola para obtener los últimos cinco dígitos :)
fuente
Si desea N dígitos, agregue 10 ^ N y elimine el primer dígito.
Salida:
fuente
Esto también funcionará:
fuente
Otra manera :
Entonces, la función simple para convertir cualquier número sería:
fuente
Una forma de utilizar la bifurcación externa del proceso es la manipulación de cadenas, en un caso genérico se vería así:
Esto también funciona bastante bien en WSL, donde la bifurcación es una operación realmente pesada. Tenía una lista de 110000 archivos, el uso
printf "%06d" $NUM
tomó más de 1 minuto, la solución anterior se ejecutó en aproximadamente 1 segundo.fuente
1.) Cree una secuencia de números 'seq' del 1 al 1000 y fije el ancho '-w' (el ancho se determina por la longitud del número final, en este caso 4 dígitos para 1000).
2.) Además, seleccione qué números desea usar 'sed -n' (en este caso, seleccionamos los números 1-100).
3.) 'echo' cada número. Los números se almacenan en la variable 'i', a la que se accede mediante '$'.
Pros: este código es bastante limpio.
Contras: 'seq' no es nativo de todos los sistemas Linux (según tengo entendido)
fuente
Si está justo después de rellenar números con ceros para lograr una longitud fija, simplemente agregue el múltiplo más cercano de 10, por ejemplo. para 2 dígitos, agregue 10 ^ 2, luego elimine el primer 1 antes de mostrar la salida.
Esta solución funciona para rellenar / formatear números individuales de cualquier longitud, o una secuencia completa de números usando un bucle for.
Probado en Mac OSX 10.6.8, Bash ver 3.2.48
fuente