J'ai besoin de boucler quelques valeurs,
for i in $(seq $first $last)
do
does something here
done
Pour $first
et $last
, j'ai besoin que ce soit de longueur fixe 5. Donc, si l'entrée est 1
, j'ai besoin d'ajouter des zéros devant pour qu'ils deviennent 00001
. Il boucle jusqu'à 99999
par exemple, mais la longueur doit être de 5.
Par exemple: 00002
, 00042
, 00212
, 012312
et ainsi de suite.
Une idée sur comment je peux faire ça?
for variable in $(something to generate the numbers); do ...
mais cela pose problème lorsque la liste des numéros est longue. Il est beaucoup plus efficace à utilisersomething to generate the numbers | while read -r variable; do ...
. Voir aussi mywiki.wooledge.org/DontReadLinesWithFor qui traite de la lecture de lignes à partir de fichiers, etc., mais certains des arguments s'appliquent ici aussi.Réponses:
Dans votre cas spécifique, il est probablement plus facile d'utiliser l'
-f
indicateurseq
pour obtenir un formatage des nombres lors de la sortie de la liste. Par exemple:produira la sortie suivante:
Plus généralement,
bash
aprintf
comme intégré de sorte que vous pouvez remplir la sortie avec des zéros comme suit:Vous pouvez utiliser l'
-v
indicateur pour stocker la sortie dans une autre variable:Notez que
printf
prend en charge un format légèrement différent,seq
vous devez donc utiliser à la%05d
place de%05g
.la source
%05g
au lieu de le%05d
réparer pour moi. "00026" me donnait "00022" . Merci!seq
prend en charge un sous - ensemble des caractères de format. quiprintf
prend en charge (et que les sous-ensembles incluentg
, mais pasd
). Le comportement des caractèresd
etg
diffère subtilement en ce qu'ild
interprète les0
chaînes de nombres préfixés comme des nombres octaux et les convertit en décimales, alors qu'il lesg
traite comme des décimales. (@EdManet: c'est pourquoi '00026' est devenu '00022' avecd
). Une autre mention de la valeur de chose:seq -w
ne automatique zéro padding des numéros de sortie en fonction du plus grand nombre possible généré.for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txt
produit une liste hexadécimale à 8 caractères. Merci.seq --help
: "FORMAT doit être approprié pour imprimer un argument de type 'double'; il vaut par défaut% .PRECf si FIRST, INCREMENT et LAST sont tous des nombres décimaux à virgule fixe avec une précision maximale PREC et à% g sinon." Les spécificateurs de conversion possibles sontefgaEFGA
.Plus simple encore, vous pouvez simplement le faire
la source
4.4.23(1)-release
Si la fin de la séquence a une longueur maximale de remplissage (par exemple, si vous voulez 5 chiffres et que la commande est "seq 1 10000"), vous pouvez utiliser l'indicateur "-w" pour seq - il ajoute le remplissage lui-même.
produire
la source
utiliser printf avec "% 05d" par exemple
la source
Utilisation très simple
printf
la source
Utilisez awk comme ceci:
PRODUCTION:
Mise à jour:
Comme alternative bash pure, vous pouvez le faire pour obtenir la même sortie:
De cette façon, vous pouvez éviter d' utiliser un programme externe
seq
qui n'est PAS disponible sur toutes les versions de * nix.la source
awk's
BEGIN
instruction afin de ne pas avoir à utiliser l'heredoc
affectation.Je remplis la sortie avec plus de chiffres (zéros) que je n'en ai besoin, puis j'utilise tail pour n'utiliser que le nombre de chiffres que je recherche. Notez que vous devez utiliser '6' en queue pour obtenir les cinq derniers chiffres :)
la source
Si vous voulez N chiffres, ajoutez 10 ^ N et supprimez le premier chiffre.
Production:
la source
Cela fonctionnera également:
la source
Autre moyen:
La fonction si simple pour convertir n'importe quel nombre serait:
la source
Une façon sans utiliser de forking de processus externe est la manipulation de chaînes, dans un cas générique, cela ressemblerait à ceci:
Cela fonctionne également très bien sur WSL, où la fourche est une opération très lourde. J'avais une liste de 110000 fichiers, en utilisant
printf "%06d" $NUM
plus de 1 minute, la solution ci-dessus a fonctionné en environ 1 seconde.la source
1.) Créez une séquence de nombres «seq» de 1 à 1000 et fixez la largeur «-w» (la largeur est déterminée par la longueur du numéro de fin, dans ce cas, 4 chiffres pour 1000).
2.) Sélectionnez également les numéros que vous souhaitez en utilisant 'sed -n' (dans ce cas, nous sélectionnons les numéros 1-100).
3.) 'écho' sur chaque numéro. Les nombres sont stockés dans la variable «i», accessible à l'aide du «$».
Avantages: Ce code est assez propre.
Inconvénients: 'seq' n'est pas natif sur tous les systèmes Linux (si je comprends bien)
la source
Si vous êtes juste après le remplissage des nombres avec des zéros pour obtenir une longueur fixe, ajoutez simplement le multiple de 10 le plus proche, par exemple. pour 2 chiffres, ajoutez 10 ^ 2, puis supprimez le premier 1 avant d'afficher la sortie.
Cette solution fonctionne pour remplir / formater des nombres simples de n'importe quelle longueur, ou une séquence entière de nombres en utilisant une boucle for.
Testé sur Mac OSX 10.6.8, Bash ver 3.2.48
la source