web-dev-qa-db-fra.com

Dans bash, comment pourrais-je ajouter des entiers avec des zéros au début et conserver un tampon spécifié

Par exemple, je veux compter de 001 à 100. Cela signifie que la mémoire tampon zéro commencerait par 2, 1, puis éventuellement 0 quand il atteindra 100 ou plus.

ex:

Je pourrais le faire si les nombres avaient un nombre prédéfini de zéros avec printf "% 02d" $ i. Mais c'est statique et non dynamique et ne fonctionnerait pas dans mon exemple. 

27
readdit

Si vous voulez dire statique ou dynamique, vous voudriez pouvoir utiliser une variable pour la largeur, vous pouvez le faire:

$ 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

L'astérisque est remplacé par la valeur de la variable à laquelle il correspond dans la liste des arguments ($padtowidth dans ce cas).

Sinon, la seule raison pour laquelle votre exemple ne fonctionne pas est que vous utilisez "2" (peut-être comme s'il s'agissait du remplissage maximum à appliquer) alors qu'il devrait être "3" (comme dans mon exemple) puisque cette valeur correspond au total résultant. width (pas la largeur du pad uniquement).

33
Dennis Williamson

Si votre système en est équipé, essayez seq avec l'option -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
32
mob

Dans Bash version 4 (utilisez bash -version), vous pouvez utiliser brace expansion . Mettre un 0 avant l'une ou l'autre limite oblige les nombres à être complétés par des zéros

echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
12
#!/bin/bash

max=100; 

for ((i=1;i<=$max;i++)); do 
    printf "%0*d\n" ${#max} $i
done

Le code ci-dessus complétera automatiquement vos nombres avec le nombre correct de 0 en fonction du nombre de chiffres contenus dans la valeur max/terminal. Tout ce que vous avez à faire est de changer la variable max et le reste sera traité.

Exemples:

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
5
SiegeX
# 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   
4
juan

Si vous devez utiliser des valeurs allant jusqu'à un nombre variable avec un remplissage 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;

Ce serait imprimer 00000, 00001, ... 00513 . (Je n'ai trouvé aucune des réponses actuelles répondant à mes besoins)

0
khaverim