web-dev-qa-db-fra.com

Comment mettre à zéro une séquence d'entiers dans bash pour que tous aient la même largeur?

J'ai besoin de boucler des valeurs,

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

Pour $first et $last, il me faut une longueur fixe de 5. Donc, si vous saisissez 1, je dois ajouter des zéros devant afin qu’il devienne 00001. Il boucle jusqu'au 99999 par exemple, mais sa longueur doit être de 5.

Exemple: 00002, 00042, 00212, 012312 et ainsi de suite.

Une idée sur comment je peux faire ça? 

331
John Marston

Dans votre cas particulier, il est probablement plus simple d'utiliser l'indicateur -f en seq pour le mettre en forme afin de formater les nombres au fur et à mesure qu'il affiche la liste. Par exemple:

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

produira la sortie suivante:

00010
00011
00012
00013
00014
00015

Plus généralement, bash a printf en tant que fonction intégrée, vous pouvez donc ajouter des zéros à la sortie comme suit:

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

Vous pouvez utiliser l'indicateur -v pour stocker le résultat dans une autre variable:

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

Notez que printf prend en charge un format légèrement différent de seq. Vous devez donc utiliser %05d au lieu de %05g.

566
Dave Webb

Plus facile encore, vous pouvez juste faire

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

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.

seq -w 1 10

produire

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

utilisez printf avec "% 05d", par exemple.

printf "%05d" 1
67
frankc

Très simple en utilisant printf

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

Utilisez awk comme ceci:

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

SORTIE:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

Mettre à jour:

En tant qu'alternative pure bash, vous pouvez le faire pour obtenir le même résultat:

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

De cette façon, vous pouvez éviter d’utiliser un programme externe seq qui est NON disponible sur tous les types de * nix.

11
anubhava

Je remplis la sortie avec plus de chiffres (zéros) que nécessaire, puis utilise tail pour n'utiliser que le nombre de chiffres que je recherche. Notez que vous devez utiliser '6' dans la queue pour obtenir les cinq derniers chiffres :)

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

Si vous voulez N chiffres, ajoutez 10 ^ N et supprimez le premier chiffre.

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

Sortie:

01
02
03
04
05
4
Burghard Hoffmann

Cela fonctionnera aussi:

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

Autre moyen:

zeroos="000"
echo 

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

Fonction si simple pour convertir n'importe quel nombre serait:

function leading_zero(){

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

}
0
Paco

Si vous êtes juste après avoir rempli des chiffres 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 avant d'afficher le résultat.

Cette solution fonctionne pour compacter/formater des nombres simples de n'importe quelle longueur, ou toute une séquence de nombres en utilisant une boucle for.

# 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

Testé sur Mac OSX 10.6.8, Bash ver 3.2.48

0
Zimba

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 final, dans ce cas 4 chiffres pour 1000). 

2.) Sélectionnez également les numéros souhaités à l'aide de 'sed -n' (dans ce cas, nous sélectionnons des numéros de 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 j'ai bien compris)

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