Ich muss einige Werte schleifen,
for i in $(seq $first $last)
do
does something here
done
Für $first
und $last
muss es eine feste Länge 5 haben. Wenn die Eingabe also ist 1
, muss ich vor Nullen Nullen hinzufügen, damit es wird 00001
. Es wiederholt sich 99999
zum Beispiel, aber die Länge muss 5 sein.
Zum Beispiel: 00002
, 00042
, 00212
, 012312
und so weiter.
Irgendeine Idee, wie ich das machen kann?
for variable in $(something to generate the numbers); do ...
aber dies ist problematisch, wenn die Liste der Zahlen lang ist. Es ist viel effizienter zu bedienensomething to generate the numbers | while read -r variable; do ...
. Siehe auch mywiki.wooledge.org/DontReadLinesWithFor, in dem das Lesen von Zeilen aus Dateien usw. erläutert wird. Einige der Argumente gelten jedoch auch hier.Antworten:
In Ihrem speziellen Fall ist es jedoch wahrscheinlich am einfachsten, das
-f
Flag zu verwendenseq
, um die Zahlen bei der Ausgabe der Liste zu formatieren. Zum Beispiel:erzeugt die folgende Ausgabe:
Im Allgemeinen
bash
istprintf
eine integrierte Funktion vorhanden, mit der Sie die Ausgabe wie folgt mit Nullen auffüllen können:Mit dem
-v
Flag können Sie die Ausgabe in einer anderen Variablen speichern:Beachten Sie, dass dies
printf
ein etwas anderes Format unterstützt als das,seq
das Sie%05d
anstelle von verwenden müssen%05g
.quelle
%05g
anstatt%05d
es für mich zu reparieren. "00026" gab mir "00022" . Vielen Dank!seq
unterstützt sie eine Teilmenge der Formatzeichen. dasprintf
unterstützt (und dass Teilmengen enthältg
, aber nichtd
). Das Verhalten von Zeichend
undg
unterscheidet sich geringfügig darin, dass Zeichenfolgen mit vorfixierten Zahlen als Oktalzahlend
interpretiert und in Dezimalzahlen konvertiert werden, während sie als Dezimalzahlen behandelt werden. (@EdManet: Deshalb wurde aus '00026' '00022' mit ). Eine andere Sache , erwähnenswert: tut automatische Zero-Padding der Ausgangszahlen basieren auf einer möglichst großen Zahl erzeugt.0
g
d
seq -w
for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txt
erzeugte eine 8-stellige hexadezimale Liste. Vielen Dank.seq --help
: "FORMAT muss zum Drucken eines Arguments vom Typ 'double' geeignet sein. Der Standardwert ist% .PRECf, wenn FIRST, INCREMENT und LAST Festkomma-Dezimalzahlen mit maximaler Genauigkeit PREC sind, andernfalls% g." Die möglichen Konvertierungsspezifizierer sindefgaEFGA
.Noch einfacher können Sie es einfach tun
quelle
4.4.23(1)-release
Wenn das Ende der Sequenz eine maximale Länge des Auffüllens hat (wenn Sie beispielsweise 5 Ziffern möchten und der Befehl "seq 1 10000" lautet), können Sie das Flag "-w" für seq verwenden - es fügt das Auffüllen selbst hinzu.
produzieren
quelle
benutze printf mit "% 05d" zB
quelle
Sehr einfach zu bedienen
printf
quelle
Verwenden Sie awk wie folgt:
AUSGABE:
Aktualisieren:
Als reine Bash-Alternative können Sie dies tun, um die gleiche Ausgabe zu erhalten:
Auf diese Weise können Sie vermeiden , ein externes Programm zu verwenden,
seq
das NICHT für alle Varianten von * nix verfügbar ist .quelle
awk's
BEGIN
Anweisung verwenden, damit wir dieheredoc
Zuweisung nicht verwenden müssen .Ich fülle die Ausgabe mit mehr Ziffern (Nullen) auf, als ich brauche, und verwende dann tail, um nur die Anzahl der Ziffern zu verwenden, nach denen ich suche. Beachten Sie, dass Sie '6' im Schwanz verwenden müssen, um die letzten fünf Ziffern zu erhalten :)
quelle
Wenn Sie N Ziffern möchten, fügen Sie 10 ^ N hinzu und löschen Sie die erste Ziffer.
Ausgabe:
quelle
Dies wird auch funktionieren:
quelle
Andere Weise :
Eine so einfache Funktion zum Konvertieren einer beliebigen Zahl wäre:
quelle
1.) Erstellen Sie eine Folge von Zahlen 'seq' von 1 bis 1000 und legen Sie die Breite '-w' fest (die Breite wird durch die Länge der Endzahl bestimmt, in diesem Fall 4 Stellen für 1000).
2.) Wählen Sie mit 'sed -n' auch die gewünschten Zahlen aus (in diesem Fall wählen wir die Zahlen 1-100 aus).
3.) Jede Zahl "wiedergeben". Zahlen werden in der Variablen 'i' gespeichert, auf die mit '$' zugegriffen wird.
Vorteile: Dieser Code ist ziemlich sauber.
Nachteile: 'seq' ist nicht für alle Linux-Systeme nativ (soweit ich weiß)
quelle
Wenn Sie nur Zahlen mit Nullen auffüllen möchten, um eine feste Länge zu erreichen, fügen Sie einfach das nächste Vielfache von 10 hinzu, z. Fügen Sie für 2 Ziffern 10 ^ 2 hinzu und entfernen Sie dann die erste 1, bevor Sie die Ausgabe anzeigen.
Diese Lösung dient zum Auffüllen / Formatieren einzelner Zahlen beliebiger Länge oder einer ganzen Folge von Zahlen mithilfe einer for-Schleife.
Getestet unter Mac OSX 10.6.8, Bash Version 3.2.48
quelle
Eine Möglichkeit ohne externe Prozessgabelung ist die Manipulation von Zeichenfolgen. In einem generischen Fall würde dies folgendermaßen aussehen:
Dies funktioniert auch bei WSL recht gut, wo das Gabeln eine sehr schwere Operation ist. Ich hatte eine 110000-Dateiliste,
printf "%06d" $NUM
die über 1 Minute dauerte, die obige Lösung lief in ca. 1 Sekunde.quelle