Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/10/2019, à 17: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, à 17: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, à 18: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, à 18:09)

Hors ligne

#3 Le 05/10/2019, à 18: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!! smile


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, à 18: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 smile. 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, à 22: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, à 19:00

pingouinux

Re : additionner des chiffres dans une chaine

Christophe C #4 a écrit :

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, à 21:44

kamaris

Re : additionner des chiffres dans une chaine

Christophe C a écrit :

Il n'y a pas plus simple ? J'aime bien comprendre ce que j’utilise, et là ... argl!! smile

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, à 23:09)

Hors ligne

#7 Le 05/10/2019, à 21: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.

Hors ligne

#8 Le 05/10/2019, à 22: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, à 22: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, à 23:09

kamaris

Re : additionner des chiffres dans une chaine

Watael a écrit :

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, à 23: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, à 23:55)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 06/10/2019, à 07:29

pingouinux

Re : additionner des chiffres dans une chaine

Christophe C #8 a écrit :

@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, à 09:47

Christophe C

Re : additionner des chiffres dans une chaine

ok, merci smile


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