#26 Le 28/09/2019, à 18:32
- Watael
Re : Faire des additions
~ $ oIFS=$IFS
~ $ unset IFS
~ $ IFS=$oIFS
~ $ od -c <<<"$IFS"
0000000 \t \n \n
0000004
$
on ne le voit pas, mais il y a un espace avant le \t.
Dernière modification par Watael (Le 28/09/2019, à 18:33)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#27 Le 28/09/2019, à 19:08
- kamaris
Re : Faire des additions
Non non, ce que je veux dire (et que dit le lien que j'ai donné) c'est
unset IFS
oIFS=$IFS
IFS=$oIFS
Là, tu ne retrouves pas ton IFS de départ, qui était non défini. Tu te retrouves avec un IFS défini à vide. Ce qui a un effet complètement différent sur la séparation des mots par le shell.
Hors ligne
#28 Le 28/09/2019, à 19:24
- Watael
Re : Faire des additions
bah, oui ! si tu effaces l'IFS avant de faire la sauvegarde ...
Dernière modification par Watael (Le 28/09/2019, à 19:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#29 Le 28/09/2019, à 19:32
- kamaris
Re : Faire des additions
Ben ça peut arriver, car tu ne l'effaces pas en l'occurrence, tu le mets à « non défini », ce qui est une valeur particulière finalement, interprétée comme telle par le shell.
En toute rigueur, cette valeur doit donc être prise en compte au nombre des valeurs possibles à sauvegarder dans oIFS (IFS n'est pas forcément censé être à sa valeur par défaut quand tu le sauvegardes, sinon la sauvegarde ne servirait à rien, la valeur par défaut étant connue).
Sauf qu'avec un simple oIFS=$IFS / IFS=$oIFS, la sauvegarde / restauration ne marchera pas. Il faut utiliser les affectations conditionnelles du bash, comme mentionné dans le lien cité (y as-tu jeté un coup d'œil ?)
Dernière modification par kamaris (Le 28/09/2019, à 19:34)
Hors ligne
#30 Le 29/09/2019, à 10:38
- Watael
Re : Faire des additions
dans l'univers des possibles, tout serait possible.
une variable non-définie n'existe pas. ce n'est pas une valeur particulière, ce n'est pas une valeur, ça n'existe pas.
entre ce qui te semble juste, en toute rigueur, et le comportement actuel du shell, c'est le comportement du shell qui prévaut.
il y a quelque chose qui m'échappe : pourquoi voudrais-je restaurer quelque chose qui n'existe pas ?
je te montre encore :
$ printf "$IFS" | od -c
0000000 \t \n
0000003
$ oIFS=$IFS
$ unset IFS
$ IFS=$oIFS
$ printf "$IFS" | od -c
0000000 \t \n
0000003
$
j'ai lu, et je n'observe pas ce que user79743 montre.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#31 Le 29/09/2019, à 11:54
- kamaris
Re : Faire des additions
une variable non-définie n'existe pas. ce n'est pas une valeur particulière, ce n'est pas une valeur, ça n'existe pas.
entre ce qui te semble juste, en toute rigueur, et le comportement actuel du shell, c'est le comportement du shell qui prévaut.
Certes, or man bash dit : « If IFS is unset, the parameters are separated by spaces. »
C'est en ce sens que je dis que si IFS est non définie, il s'agit d'« une valeur particulière finalement, interprétée comme telle par le shell » : il adopte un comportement particulier dans ce cas.
il y a quelque chose qui m'échappe : pourquoi voudrais-je restaurer quelque chose qui n'existe pas ?
Parce que tu ne restaurerais pas quelque chose qui n'existe pas, mais le fait que cette chose n'existe pas.
Si ta situation de départ est que l'IFS est non défini (par hypothèse, il ne s'agit pas de savoir pourquoi et comment on en est arrivé là), et que tu changes l'IFS pour tes besoins, alors restaurer ensuite l'IFS à sa situation de départ signifiera le remettre à non défini.
La question est : comment fait-on ça ?
Par un stockage basique de la valeur d'IFS dans une varibale temporaire ? Non, ça ne marchera pas, la valeur restaurée sera vide (cf. #27)
Par une affectation conditionnelle comme dans https://unix.stackexchange.com/question … 947#264947 ? Oui, là le caractère non défini d'IFS sera restauré.
je te montre encore :
$ printf "$IFS" | od -c 0000000 \t \n 0000003 $ oIFS=$IFS $ unset IFS $ IFS=$oIFS $ printf "$IFS" | od -c 0000000 \t \n 0000003 $
J'ai bien vu ce que tu dis, mais cela ne correspond pas à l'hypothèse dans laquelle je place la discussion dès #25, à savoir que l'on ne part pas d'un IFS à sa valeur par défaut, mais d'un IFS non défini.
j'ai lu, et je n'observe pas ce que user79743 montre.
Que veux-tu dire ?
Hors ligne
#32 Le 29/09/2019, à 12:17
- Watael
Re : Faire des additions
je ne spécule pas sur des hypothèses improbables.
à l'ouverture d'un shell, l'IFS a une valeur par défaut. point.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#33 Le 29/09/2019, à 12:19
- kamaris
Re : Faire des additions
Effectivement, comme ça c'est plus simple
Hors ligne
#34 Le 29/09/2019, à 12:29
- Watael
Re : Faire des additions
ben, oui. KISS!
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#35 Le 11/10/2019, à 13:16
- jeteztout
Re : Faire des additions
J'utilise le script et c'est fort pratique.
Je me demandais s'il était possible de l'élaborer un peu ?
Par exemple si mon fichier source ressemble à ça :
"Input 1" 1 2 3 !
"Input 2" 4 5 6 !
Et que je souhaite avoir en résultat :
"Input 1" 6
"Input 2" 15
Où pour le coup ce qui est entre guillemet " " doit être repris tel quel et le ! ne sert qu'à dire que l'addition doit s'arrêter à cette endroit.
Est-ce très compliqué ? Merci encore
Hors ligne
#36 Le 11/10/2019, à 14:06
- pingouinux
Re : Faire des additions
Hello,
awk -F'["!]' '{n=split($3,v," ");s=0;for(i=1;i<=n;i++){s+=v[i]};if(s)printf("\"%s\" %d\n",$2,s)}' fichier
Édité :
Modification du format pour tenir compte des nombres non entiers (%d -> %s)
awk -F'["!]' '{n=split($3,v," ");s=0;for(i=1;i<=n;i++){s+=v[i]};if(s)printf("\"%s\" %s\n",$2,s)}' fichier
Dernière modification par pingouinux (Le 11/10/2019, à 16:56)
Hors ligne
#37 Le 11/10/2019, à 16:30
- LeoMajor
Re : Faire des additions
bonjour,
:~$ cat /tmp/text01.txt
"Input 1" 1 2 3 !
"Input 2" 4 5 6 !
"Input 3" 100 101 citron 102 vanille total !
"Input 4" 0 1 2 @ total !
:~$ cat /tmp/text02.txt
"Input 1" 1 2 3 !
"Input 2" 4 5 6 !
"Input 3" 100 101 citron 102 vanille total !
"Input 4" 0 1 -2 -9 @ total !
"Input 5" titane -11.5 +4.3 -0.3 +0.75 !
:~$ gawk 'BEGIN{FPAT="[-|+]*[0-9.]+|\"Input [0-9]+\""; total=0; }; BEGINFILE{sum=0}{for (i=2;i<=NF;i++)loc+=$i}{print $1,loc; sum+=loc; loc=0}; ENDFILE {print FILENAME,"somme=",sum; total+=sum}; END {print "total=",total}' /tmp/text*.txt
"Input 1" 6
"Input 2" 15
"Input 3" 303
"Input 4" 3
/tmp/text01.txt somme= 327
"Input 1" 6
"Input 2" 15
"Input 3" 303
"Input 4" -10
"Input 5" -6.75
/tmp/text02.txt somme= 307.25
total= 634.25
Hors ligne
#38 Le 16/10/2019, à 09:46
- jeteztout
Re : Faire des additions
Super! Quel bonheur de ne plus avoir à utiliser d'interface
Merci à tous
Dernière modification par jeteztout (Le 16/10/2019, à 09:46)
Hors ligne