#1 Le 05/10/2019, à 16:27
- Christophe C
additionner des chiffres dans une chaine
Je sais additionner une variable simple et un chiffre. Genre TOTO=$(($VAR + 1)). Si VAR=2, alors TOTO=3
Par contre, je voudrais faire de même avec un série dans une chaîne :
la chaine est comme cela : 0 1 2 3 ou 0!1!2!3
ce pourrait aussi être un fichier texte avec retour à la ligne \n, genre
0\n
1\n
2\n
3\n
L'idée est d'ajouter quelque chose (disons 1) à chaque membre de la chaine.
Et là, je ne sais pas comment faire.
Dernière modification par Christophe C (Le 05/10/2019, à 16:28)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#2 Le 05/10/2019, à 17:00
- pingouinux
Re : additionner des chiffres dans une chaine
Bonjour,
$ awk '{OFS=FS;for(i=1;i<=NF;i++) printf("%d%s",$i+1,OFS);print "\b "}' <<<'0 1 2 3'
1 2 3 4
$ awk -F'!' '{OFS=FS;for(i=1;i<=NF;i++) printf("%d%s",$i+1,OFS);print "\b "}' <<<'0!1!2!3'
1!2!3!4
Et avec des nombres en colonne dans un fichier (1 par ligne)
$ cat fichier
0
1
2
3
$ awk '{printf("%d\n",$i+1)}' fichier
1
2
3
4
Dernière modification par pingouinux (Le 05/10/2019, à 17:09)
Hors ligne
#3 Le 05/10/2019, à 17:11
- Christophe C
Re : additionner des chiffres dans une chaine
Merci.
Il n'y a pas plus simple ? J'aime bien comprendre ce que j’utilise, et là ... argl!!
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#4 Le 05/10/2019, à 17:41
- Christophe C
Re : additionner des chiffres dans une chaine
Incidement, il y a un petit bug :
LIST='0!1!2!3'
LIST2=$(awk -F'!' '{OFS=FS;for(i=1;i<=NF;i++) printf("%d%s",$i+1,OFS);print "\b "}' <<< $LIST)
echo $LIST2
renvoi :
1!2!3!4!
Les 2 derniers caractères sont de trop . je peut facilement les enlever par un cut, mais si on peut les éviter de base ...
Dernière modification par Christophe C (Le 05/10/2019, à 21:45)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#5 Le 05/10/2019, à 18:00
- pingouinux
Re : additionner des chiffres dans une chaine
Les 2 derniers caractères sont de trop
Tu n'avais qu'un seul caractère en trop (le !)
Il faut faire
echo "$LIST2"
Hors ligne
#6 Le 05/10/2019, à 20:44
- kamaris
Re : additionner des chiffres dans une chaine
Il n'y a pas plus simple ? J'aime bien comprendre ce que j’utilise, et là ... argl!!
Je ne sais pas si c'est plus simple, mais en bash, dans le cas d'une chaine a='0!1!2!3', tu peux faire
IFS='!'; ar=()
for n in $a; do ar+=("$((++n))"); done
echo "${ar[*]}"
Dernière modification par kamaris (Le 05/10/2019, à 22:09)
Hors ligne
#7 Le 05/10/2019, à 20:59
- Watael
Re : additionner des chiffres dans une chaine
puis, on restaure l'IFS; si on y pense...
donc, on évite de modifier l'IFS :
a=${a//\!/ }
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#8 Le 05/10/2019, à 21:46
- Christophe C
Re : additionner des chiffres dans une chaine
@pingouinux : non, il y a bien 2 caractère de trop : le !, et un caractère spécial bizarre.
Comment les éviter ? Question non critique, je les enlève déjà avec un wc -m (pour la longueur de chaine) et un cut.
Dernière modification par Christophe C (Le 05/10/2019, à 21:47)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#9 Le 05/10/2019, à 22:09
- kamaris
Re : additionner des chiffres dans une chaine
puis, on restaure l'IFS; si on y pense...
donc, on évite de modifier l'IFS :
a=${a//\!/ }
Mouais, sauf que la concaténation finale de ar ne donnera pas le résultat escompté dans ce cas.
Par ailleurs le remplacement des espaces par des « ! » peut vite devenir lourd si la chaine est un peu longue.
Faire jouer l'IFS est à la fois pratique et performant ici. En fait, le bout de code donné en #6 est plutôt prévu pour être utilisé dans un sous-shell :
a=$(
IFS='!'; ar=()
for n in $a; do ar+=("$((++n))"); done
echo "${ar[*]}"
)
Ainsi la modification de l'IFS et le tableau disparaissent avec le sous-shell.
NB : par contre il y avait une erreur que j'ai corrigée au niveau de la post-incrémentation de n : il faut une pré-incrémentation.
Hors ligne
#10 Le 05/10/2019, à 22:54
- Watael
Re : additionner des chiffres dans une chaine
contrairement à python et autres, l'initialisation d'un tableau (en plus, ici, dans un sous-shell) n'est pas nécessaire;
et les guillemets, avec les évaluations arithmétiques, pareil.
Dernière modification par Watael (Le 05/10/2019, à 22:55)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#11 Le 06/10/2019, à 06:29
- pingouinux
Re : additionner des chiffres dans une chaine
@pingouinux : non, il y a bien 2 caractère de trop : le !, et un caractère spécial bizarre.
Sur ta sortie en #4, il n'apparaît que le !.
En fait, il s'agit de ! suivi de 0x08 (backspace). Le deuxième caractère efface le premier. Et il y a d'ailleurs une espace en plus pour réellement effacer le caractère déjà écrit.
$ LIST='0!1!2!3'
$ LIST2=$(awk -F'!' '{OFS=FS;for(i=1;i<=NF;i++) printf("%d%s",$i+1,OFS);print "\b "}' <<<"$LIST")
$ echo $LIST2
1!2!3!4!
$ echo $LIST2|hd
00000000 31 21 32 21 33 21 34 21 08 0a |1!2!3!4!..|
0000000a
$ echo "$LIST2"
1!2!3!4
$ echo "$LIST2"|hd
00000000 31 21 32 21 33 21 34 21 08 20 0a |1!2!3!4!. .|
0000000b
Hors ligne
#12 Le 06/10/2019, à 08:47
- Christophe C
Re : additionner des chiffres dans une chaine
ok, merci
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne