In bash, wie könnte ich ganze Zahlen mit führenden Nullen hinzufügen und einen angegebenen Puffer halten

StackOverflow https://stackoverflow.com/questions/3191067

  •  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.

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top