it-swarm.com.de

Wie kann man eine Folge von Ganzzahlen in Bash auf Null setzen, damit alle dieselbe Breite haben?

Ich muss einige Werte schleifen,

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

Für $first und $last brauche ich eine feste Länge 5. Wenn die Eingabe 1 ist, muss ich vor Nullen Nullen hinzufügen, sodass 00001 wird. Es wird zum Beispiel bis 99999 durchlaufen, aber die Länge muss 5 sein.

Beispiel: 00002, 00042, 00212, 012312 und so weiter.

Irgendeine Idee, wie ich das machen kann? 

331
John Marston

In Ihrem speziellen Fall ist es jedoch wahrscheinlich am einfachsten, das Flag -f für seq zu verwenden, damit die Zahlen bei der Ausgabe der Liste formatiert werden. Zum Beispiel:

for i in $(seq -f "%05g" 10 15)
do
  echo $i
done

erzeugt folgende Ausgabe:

00010
00011
00012
00013
00014
00015

Allgemeiner gesagt hat bashprintf als integriertes Element, sodass Sie die Ausgabe mit Nullen wie folgt auffüllen können:

$ i=99
$ printf "%05d\n" $i
00099

Sie können das Flag -v verwenden, um die Ausgabe in einer anderen Variablen zu speichern:

$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099

Beachten Sie, dass printf ein etwas anderes Format als seq unterstützt. Daher müssen Sie %05d anstelle von %05g verwenden.

566
Dave Webb

Noch einfacher können Sie es tun

for i in {00001..99999}; do
  echo $i
done
103
Indie

Wenn das Ende der Sequenz die maximale Länge der Auffüllung hat (wenn Sie zum Beispiel 5 Ziffern haben möchten und der Befehl "seq 1 10000" ist), können Sie das Flag "-w" für seq verwenden - es fügt selbst Auffüllen hinzu.

seq -w 1 10

produzieren

01
02
03
04
05
06
07
08
09
10
68
m_messiah

verwenden Sie printf mit "% 05d", z.

printf "%05d" 1
67
frankc

Sehr einfach mit printf

[jaypal:~/Temp] printf "%05d\n" 1
00001
[jaypal:~/Temp] printf "%05d\n" 2
00002
16
jaypal singh

Verwenden Sie awk wie folgt:

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

AUSGABE:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

Update:

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

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

Auf diese Weise können Sie mit einem externen Programm seq, das NICHT verfügbar ist auf allen Geschmacksrichtungen von * nix vermeiden.

11
anubhava

Ich fülle die Ausgabe mit mehr Ziffern (Nullen) auf, als ich brauche, und benutze dann Tail, um nur die Anzahl der Ziffern zu verwenden, nach denen ich suche. Beachten Sie, dass Sie im Schwanz '6' 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
8
unifex

Wenn Sie N Ziffern wünschen, fügen Sie 10 ^ N hinzu 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
4

Das wird auch funktionieren:

for i in {0..9}{0..9}{0..9}{0..9}
do
  echo "$i"
done
1
Chris

Andere Weise :

zeroos="000"
echo 

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

Eine einfache Funktion zum Konvertieren einer beliebigen Zahl wäre also:

function leading_zero(){

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

}
0
Paco

Wenn Sie nur nach dem Auffüllen von Zahlen mit Nullen suchen, um eine feste Länge zu erreichen, addieren Sie einfach das nächste Vielfache von 10, z. Fügen Sie für 2 Ziffern 10 ^ 2 hinzu und entfernen Sie die erste 1, bevor Sie die Ausgabe anzeigen.

Mit dieser Lösung können einzelne Zahlen beliebiger Länge oder eine ganze Folge von Zahlen mit einer for-Schleife aufgefüllt/formatiert werden.

# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf

pad=100000      ;# 5 digit fixed

for i in {0..99999}; do ((j=pad+i))
    echo ${j#?}
done

Getestet unter Mac OSX 10.6.8, Bash Version 3.2.48

0
Zimba

1.) Erstellen Sie eine Folge von Zahlen 'seq' von 1 bis 1000 und legen Sie die Breite '-w' fest (Breite wird durch die Länge der Endnummer bestimmt, in diesem Fall 4 Ziffern für 1000). 

2.) Wählen Sie auch die gewünschten Nummern mit 'sed -n' aus (in diesem Fall wählen Sie die Nummern 1-100). 

3.) "Echo" aus jeder Zahl. Zahlen werden in der Variablen 'i' gespeichert, auf die mit '$' zugegriffen wird.

Vorteile: Dieser Code ist ziemlich sauber.

Nachteile: 'seq' ist nicht in allen Linux-Systemen enthalten (so wie ich es verstehe)

for i in `seq -w 1 1000 | sed -n '1,100p'`; 
do 
    echo $i; 
done
0
nick