In bash, wie könnte ich ganze Zahlen mit führenden Nullen hinzufügen und einen angegebenen Puffer halten
-
02-10-2019 - |
Frage
Zum Beispiel möchte ich von 001 bis 100 zählen Bedeutung des Null-Puffer mit 2 beginnen würde, 1, dann schließlich 0, wenn es 100 oder mehr erreicht.
ex: 001 002 ... 010 011 ... 098 099 100
Ich konnte dies tun, wenn die Zahlen eine vorgegebene Anzahl von Nullen mit printf „% 02d“ i $ haben. Aber das ist statisch und nicht dynamisch und nicht funktionieren würde in meinem Beispiel.
Lösung
Wenn durch statische und dynamische Sie bedeuten, dass Sie eine Variable in der Lage sein möchten, für die Breite zu verwenden, können Sie dies tun:
$ 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
Der Stern durch den Wert der Variablen ersetzt wird (in diesem Fall $padtowidth
) in der Argumentliste entspricht.
Ansonsten ist der einzige Grund, warum Ihr Beispiel nicht funktioniert, ist, dass Sie „2“ (vielleicht, als ob es die maximale Polsterung anzuwenden war), wenn es sollte „3“ (wie in meinem Beispiel), da dieser Wert die sich ergebende Gesamtbreite (nicht die polster nur Breite).
Andere Tipps
Wenn Ihr System hat, versucht seq
mit dem -w
(--equal-width
) Option:
$ 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
In Bash Version 4 (Verwendung bash -Version) können Sie Klammer Expansion . Einlochen 0
vor entweder Grenzkräfte, die Zahlen durch Nullen aufgefüllt werden
echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
#!/bin/bash
max=100;
for ((i=1;i<=$max;i++)); do
printf "%0*d\n" ${#max} $i
done
Der obige Code wird automatisch Pad Ihrer Zahlen mit der richtigen Anzahl von 0 davon ab, wie viele Stellen der max / Endwert enthält. Alles was Sie tun müssen, ist die max
Variable ändern und es wird den Rest.
Beispiele:
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
# 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
Wenn Sie Pad müssen mit variabler Polsterung zu einer variablen Anzahl Werte bis:
$values_count=514;
$padding_width=5;
for i in 0 `seq 1 $(($values_count - 1))`; do printf "%0*d\n" $padding_width $i; done;
Dies würde auszudrucken 00000, 00001, 00513 .... (Ich habe keine der aktuellen Antworten treffen mein Bedürfnis finden)