609 Stimmen

Wie man Null-Pad eine Folge von Integer in Bash, so dass alle die gleiche Breite haben?

Ich brauche eine Schleife für einige Werte,

for i in $(seq $first $last)
do
    does something here
done

Para $first y $last Ich brauche eine feste Länge von 5. Wenn die Eingabe also lautet 1 muss ich Nullen vorangestellt werden, so dass es zu 00001 . Er schleift bis 99999 zum Beispiel, aber die Länge muss 5 sein.

Z.B.: 00002 , 00042 , 00212 , 012312 und so weiter.

Haben Sie eine Idee, wie ich das machen kann?

14voto

anubhava Punkte 713155

Verwenden Sie awk wie folgt:

awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}'

OUTPUT:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

更新しました。

Als reine Bash-Alternative können Sie dies tun, um die gleiche Ausgabe zu erhalten:

for i in {1..10}
do
   printf "%05d\n" $i
done

Auf diese Weise können Sie vermeiden Verwendung eines externen Programms seq das ist NICHT verfügbar auf allen *nix-Varianten.

12voto

unifex Punkte 165

Ich fülle die Ausgabe mit mehr Ziffern (Nullen) auf, als ich benötige, und verwende dann tail, um nur die Anzahl der Ziffern zu verwenden, die ich benötige. Beachten Sie, dass Sie "6" in tail verwenden müssen, um die letzten fünf Ziffern zu erhalten :)

for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done

10voto

Burghard Hoffmann Punkte 145

Wenn Sie N Ziffern benötigen, addieren Sie 10^N und löschen Sie die erste Ziffer.

for (( num=100; num<=105; num++ ))
do
  echo ${num:1:3}
done

Ausgabe:

01
02
03
04
05

6voto

Paco Punkte 131

Anderer Weg :

zeroos="000"
echo 

for num in {99..105};do
 echo ${zeroos:${#num}:${#zeroos}}${num}
done

Eine einfache Funktion zur Umwandlung einer beliebigen Zahl wäre also:

function leading_zero(){

    local num=$1
    local zeroos=00000
    echo ${zeroos:${#num}:${#zeroos}}${num} 

}

6voto

Tamisoft Punkte 73

Eine Möglichkeit, ohne externes Prozess-Forking auszukommen, ist die Manipulation von Zeichenketten, die im allgemeinen Fall folgendermaßen aussehen würde:

#start value
CNT=1

for [whatever iterative loop, seq, cat, find...];do
   # number of 0s is at least the amount of decimals needed, simple concatenation
   TEMP="000000$CNT"
   # for example 6 digits zero padded, get the last 6 character of the string
   echo ${TEMP:(-6)}
   # increment, if the for loop doesn't provide the number directly
   TEMP=$(( TEMP + 1 ))
done

Dies funktioniert auch bei WSL, wo das Forken eine wirklich schwere Operation ist. Ich hatte eine Liste mit 110000 Dateien, die ich mit printf "%06d" $NUM dauerte über 1 Minute, die obige Lösung lief in etwa 1 Sekunde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X