Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

bash: formatage d'un nombre

7 réponses
Avatar
Hugolino
Salut,

Comme vous pouvez le voir dans ma signature, j'ai adopté la «Jacoboni's
touch» pour afficher mon age en seconde.

Pour ça j'utilise $(date -d ${Date_Naissance} +%s) et je bidouille avec
$(date +%s) et j'obtiens bien le nombre de secondes écoulée depuis ma
naissance.
Mais la bidouille que j'avais mise au point avec LC_NUMERIC="da_DK" pour
obtenir "1 357 745 911" plutôt que "1357745911" ne marche plus.

Après consultation de "info coreutils printf", j'ai dans l'idée qu'il
faut que j'utilise la directive %b et/ou %f, mais sans en être sûr et
d'ailleurs mes divers essais ne mènent à rien de bon.

Bref, à supposer que $Secondes contienne "1357745911", comment obtenir
"1 357 745 911" ?
Faut il utiliser sed ou awk ?

Merci


--
Multi-taches, comme Windows et Woolite, ou multitâches, comme Unix ?
-+- GR in Guide du CLXien Pervers: "Linux lave plus blanc" -+-
Hugo (né il y a 1357745911 secondes)

7 réponses

Avatar
ALain Montfranc
Hugolino a écrit
Salut,

Comme vous pouvez le voir dans ma signature, j'ai adopté la «Jacoboni's
touch» pour afficher mon age en seconde.

Pour ça j'utilise $(date -d ${Date_Naissance} +%s) et je bidouille avec
$(date +%s) et j'obtiens bien le nombre de secondes écoulée depuis ma
naissance.
Mais la bidouille que j'avais mise au point avec LC_NUMERIC="da_DK" pour
obtenir "1 357 745 911" plutôt que "1357745911" ne marche plus.

Après consultation de "info coreutils printf", j'ai dans l'idée qu'il
faut que j'utilise la directive %b et/ou %f, mais sans en être sûr et
d'ailleurs mes divers essais ne mènent à rien de bon.

Bref, à supposer que $Secondes contienne "1357745911", comment obtenir
"1 357 745 911" ?
Faut il utiliser sed ou awk ?

Merci


Tu peux faire

echo "1357745911" | rev | sed 's/.../& /g' | rev

Avatar
Jacques L'helgoualc'h
Le 04-05-2007, ALain Montfranc a écrit :
Hugolino a écrit
Salut,



bonsoir,

[...]


echo "1357745911" | rev | sed 's/.../& /g' | rev


(GNU sed)

sed -e ':A
s/([0-9])([0-9]{3})>/1 2/
tA'

ou encore

sed -re ':A;s/([0-9]+)([0-9]{3})/1 2/;tA'

--
Jacques L'helgoualc'h


Avatar
Hugolino
Le Fri, 4 May 2007 22:24:53 +0200 (CEST), Jacques L'helgoualc'h a écrit:
Le 04-05-2007, ALain Montfranc a écrit :
Hugolino a écrit
Salut,



bonsoir,

[...]


echo "1357745911" | rev | sed 's/.../& /g' | rev


(GNU sed)

sed -e ':A
s/([0-9])([0-9]{3})>/1 2/
tA'

ou encore

sed -re ':A;s/([0-9]+)([0-9]{3})/1 2/;tA'


L'avantage de la ligne d'Alain est d'être beaucoup plus facile à
analiser, si j'ai bien compris le sed 's/.../& /g' matche trois
caractères quelconques et ajoute une espace.
à froid j'aurais cru qu'elle aurait *remplacé* par un espace, c'est le &
qui fait que ça ajoute ?

Quand à ':A;s/([0-9]+)([0-9]{3})/1 2/;tA', j'ai beau avoir la page de
man de sed sous les yeux, je crois que je perds mon temps à essayer de
comprendre, faudrait qu'on me décortique ça étape par étape :)

Merci à vous deux.
--
"Alors je crois savoir ce qui n'allait pas. J'ai désactivé l'option: Send
in rich HTML by default. Et je crois que c'était ça qui foutait le
bordel." -+- EF in GLP : "Bien configurer son Netscape" -+-
Hugo (né il y a 1 357 777 002 secondes)



Avatar
Jacques L'helgoualc'h
Le 04-05-2007, Hugolino a écrit :
Le Fri, 4 May 2007 22:24:53 +0200 (CEST), Jacques L'helgoualc'h a écrit:
Le 04-05-2007, ALain Montfranc a écrit :
[...]
echo "1357745911" | rev | sed 's/.../& /g' | rev



(GNU sed)

sed -e ':A
s/([0-9])([0-9]{3})>/1 2/
tA'

ou encore

sed -re ':A;s/([0-9]+)([0-9]{3})/1 2/;tA'


L'avantage de la ligne d'Alain est d'être beaucoup plus facile à
analiser, si j'ai bien compris le sed 's/.../& /g' matche trois
caractères quelconques et ajoute une espace.
à froid j'aurais cru qu'elle aurait *remplacé* par un espace, c'est le &
qui fait que ça ajoute ?


Oui, & représente ce qui est reconnu par le motif complet --- ici, trois
caractères quelconques.

Quand à ':A;s/([0-9]+)([0-9]{3})/1 2/;tA', j'ai beau avoir la page de
man de sed sous les yeux,


Essaie plutôt « info sed », plus détaillé.

je crois que je perds mon temps à essayer de comprendre, faudrait
qu'on me décortique ça étape par étape :)


- :A est une étiquette ;

- s/([0-9]+)([0-9]{3})/1 2/ insère un espace entre le ou les premiers
chiffres et les trois derniers dans le premier bloc de quatre (ou
plus);

- tA saute à l'étiquette A tant que la dernière substitution a réussi.

Pour voir comment ça marche, utilise par exemple la commande « l » :

echo 1357745911 | sed -re ':A;l;s/([0-9]+)([0-9]{3})/1 2/;tA'
1357745911$
1357745 911$
1357 745 911$
1 357 745 911$
1 357 745 911

(l'option « r » ne sert qu'à économiser sept contre-obliques).

Comme on doit travailler de droite à gauche, le « g » est inutile,
j'utilise l'avidité du premier groupe, ou la balise de fin > (GNU sed).

Le recueil http://sed.sf.net/sed1line.txt donne deux ou trois recettes
analogues « add commas to num... ».

Merci à vous deux.


de rien,
--
Jacques L'helgoualc'h




Avatar
Hugolino
Le Sat, 5 May 2007 11:31:13 +0200 (CEST), Jacques L'helgoualc'h a écrit:
Le 04-05-2007, Hugolino a écrit :

L'avantage de la ligne d'Alain est d'être beaucoup plus facile à
analyser, si j'ai bien compris le sed 's/.../& /g' matche trois
caractères quelconques et ajoute une espace.
à froid j'aurais cru qu'elle aurait *remplacé* par un espace, c'est le &
qui fait que ça ajoute ?


Oui, & représente ce qui est reconnu par le motif complet --- ici, trois
caractères quelconques.

Quand à ':A;s/([0-9]+)([0-9]{3})/1 2/;tA', j'ai beau avoir la page de
man de sed sous les yeux,


Essaie plutôt « info sed », plus détaillé.


OK (le seul problème est que je ne sais pas naviguer dans les nodes
d'info et info info ne m'aide pas vraiment :)

je crois que je perds mon temps à essayer de comprendre, faudrait
qu'on me décortique ça étape par étape :)


- :A est une étiquette ;

- s/([0-9]+)([0-9]{3})/1 2/ insère un espace entre le ou les premiers
chiffres et les trois derniers dans le premier bloc de quatre (ou
plus);

- tA saute à l'étiquette A tant que la dernière substitution a réussi.

Pour voir comment ça marche, utilise par exemple la commande « l » :

echo 1357745911 | sed -re ':A;l;s/([0-9]+)([0-9]{3})/1 2/;tA'
1357745911$
1357745 911$
1357 745 911$
1 357 745 911$
1 357 745 911

(l'option « r » ne sert qu'à économiser sept contre-obliques).

Comme on doit travailler de droite à gauche, le « g » est inutile,
j'utilise l'avidité du premier groupe, ou la balise de fin > (GNU sed).


J'avais *complètement* oublié que sed travaillait de droite à gauche !!

C'est quoi l'"avidité" ?

Le recueil http://sed.sf.net/sed1line.txt donne deux ou trois recettes
analogues « add commas to num... ».

Merci à vous deux.


de rien,


Si si j'insiste... (lourdement ?)

--
/me vient de penser au concept du string cordless, pas ininteressant...
Hugo (né il y a 1 357 823 859 secondes)


Avatar
Jacques L'helgoualc'h
Le 05-05-2007, Hugolino a écrit :
Le Sat, 5 May 2007 11:31:13 +0200 (CEST), Jacques L'helgoualc'h a écrit:
[...]

Essaie plutôt « info sed », plus détaillé.


OK (le seul problème est que je ne sais pas naviguer dans les nodes
d'info et info info ne m'aide pas vraiment :)


Bah, tu tape « Entrée » sur les liens, ou « l » pour revenir en arrière...
Je préfère avec Emacs, mais on n'est plus vendredi à cette heure-ci.

[...]
Comme on doit travailler de droite à gauche, le « g » est inutile,
j'utilise l'avidité du premier groupe, ou la balise de fin > (GNU sed).


J'avais *complètement* oublié que sed travaillait de droite à gauche !!


Heu, de gauche à droite, en principe --- réfléchis avant de voter du bon
côté :)

C'est quoi l'"avidité" ?


Le « [0-9]+ » est glouton, il essaie d'avaler le plus possible de
chiffres ; en fait, il va jusqu'au bout, puis doit reculer de trois pas
pour satisfaire le second bloc...

De toutes façons, on doit ici compter à partir de la droite, donc un
comportement avare (greedy) ne suffirait pas.


Ton âge en secondes ne risque pas de diminuer, ni d'avoir un chiffre de
plus avant longtemps : une solution plus rapide mais trop particulière à
ton problème serait

sed -re 's/([1-9])([0-9]{3})([0-9]{3})([0-9]{3})/1 2 3 4/'


Merci à vous deux.


de rien,


Si si j'insiste... (lourdement ?)


Sed, c'est léger...
--
Jacques L'helgoualc'h



Avatar
Hugolino
Le Sat, 5 May 2007 15:47:08 +0200 (CEST), Jacques L'helgoualc'h a écrit:
Le 05-05-2007, Hugolino a écrit :
Le Sat, 5 May 2007 11:31:13 +0200 (CEST), Jacques L'helgoualc'h a écrit:
[...]

Essaie plutôt « info sed », plus détaillé.


OK (le seul problème est que je ne sais pas naviguer dans les nodes
d'info et info info ne m'aide pas vraiment :)


Bah, tu tape « Entrée » sur les liens, ou « l » pour revenir en arrière...
Je préfère avec Emacs, mais on n'est plus vendredi à cette heure-ci.


Parfait.

[...]
Comme on doit travailler de droite à gauche, le « g » est inutile,
j'utilise l'avidité du premier groupe, ou la balise de fin > (GNU sed).


J'avais *complètement* oublié que sed travaillait de droite à gauche !!


Heu, de gauche à droite, en principe --- réfléchis avant de voter du bon
côté :)


???
Tu disais "> >> Comme on doit travailler de droite à gauche"...
puis tu dis "> Heu, de gauche à droite, en principe"

Bayrou ?

C'est quoi l'"avidité" ?


Le « [0-9]+ » est glouton, il essaie d'avaler le plus possible de
chiffres ; en fait, il va jusqu'au bout, puis doit reculer de trois pas
pour satisfaire le second bloc...

De toutes façons, on doit ici compter à partir de la droite, donc un
comportement avare (greedy) ne suffirait pas.


OK, je vais chercher avec ces mots-clés...

Merci.

--
(Pas Adabase que j'ai en version démo sur la distribution Suze).
Et après ça, allez expliquer que les linuxiens sont pas alcolos... ;-)

à quand une distribution Kro v1.6.64 ou Pastis v5.1?
-+- Fantec In Guide du linuxien pervers - "C'est l'heure de l'apéro ?" -+-