Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/04/2011, 14h17   #1
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
Par défaut un problème sur awk

Bonjour,

J'ai besoin de manipuler des chiffres dans un fichier .tem et de les transférer dans un fichier .out.

Mon problème est que je n'arrive pas à obtenir le bon résultat après un calcul de division avec les chiffres qui sont présents dans le fichier .tem.

Par exemple, je divise 1.2022222 par 100, ça donne 0. J'ai testé même avec2.403126079 +1, ça donne 3 au lieu de 3.403126079.

Merci d'avance pour votre aide.

Clement
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 27/04/2011, 15h15   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
c'est pas la bonne solution.

La bonne solution est de calculer directement en décimale par exemple avec dc pour empêcher toute création d'un entier absolu (qui ne peut pas devenir un décimal)

exemple
4.320001 dans un fichier texte :

Code :
1
2
3
~:$ echo "9k "$(cat fichier)" 3.43 + pq" | dc
7.750001
~:$
ce qui évitera d'avoir à faire un travail post-traitement qui sera pourquoi pas source d'erreurs potentielles supplémentaire...
autant travailler depuis le départ en décimal.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/04/2011, 09h38   #3
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Suite au Message privé un exemple complêt avec awk pour traiter le fichier :

voilà la solution avec un exemple concret

il faut faire
Code :
echo "9k "$(commande_sortie_donnée)" 100 / " | dc > outpout
9k c'est juste le niveau de précision (nombre de décimales)
de plus dc utilise la notation mathématique RPN.

donc pour un fichier qui à par exemple
ça devient pour une division par 100 :
Code :
1
2
3
4
5
6
7
8
 
~:$ cat > fichier
a E 30 t 350 r
^D
~:$ echo "9k "$(awk '{print $5}' fichier)" 100 / pq" > output
~:$ cat output
3.500000000
~:$ rm output fichier
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/04/2011, 17h02   #4
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
Par défaut awk

J'ai créé un .awk à faire l’extraction Extrat.awk et un batch, le code dans le batch est :

Code :
1
2
3
4
5
6
gawk -f ..\Extrat.awk -v outfile=..\ex.out    ..\\ex.tmp
 
echo "9k "$(awk '{print $16}')" 100 / " | dc > outfile outfile=..\\resultat.out   ..\\ex.out
 
rm ..\\ resultat.out
rm ..\\ex.tmp
Mais le batch ne marche pas, est-ce qu'il y a une erreur de syntaxe dans le batch ?


Clement
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/04/2011, 08h49   #5
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par debutanta Voir le message
J'ai créé un .awk à faire l’extraction Extrat.awk et un batch, le code dans le batch est :

Mais le batch ne marche pas, est-ce qu'il y a une erreur de syntaxe dans le batch ?


Clement
Y'a que ça des erreurs dans le batch....

Comme je te l'ai déjà dit dans les messages privés, je répète :

un batch à forcément un interpréteur en entête tu n'en as pas.
tes chemins sont tous faux "\" un chemin unix ne contient jamais de "\"
tu déclares des choses après leur usage... c'est impossible.
tu aurais au moins pu prendre 30 secondes pour regarder un exemple avant de te lancer parce que là tu aurai vu toi même que ça allait pas avant même de tenter de lancer le script

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#!/bin/sh
EX=/chemin/reel/ailleurs_possible/ex.tmp
outfile=/chemin/quelque/part/fichier
# debut du code
# extraction
gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX
if [ $? -ne 0 ]; then echo "erreur dans la commande : gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX " 
exit 1
fi 
# calcul
echo "9k "$(awk '{print $16}')" 100 / " | dc > $outfile 
if [ $? -ne 0 ]; then echo "erreur dans la commande : echo \"9k \"$(awk '{print $16}')\" 100 / \" | dc > $outfile"
exit 2
fi
# purge du fichier EX
rm $EX
if [ $? -ne 0 ] ; then echo "erreur lors de l effacement de $EX"
exit 3
fi
exit 0
à minima quelque chose comme ça...
et encore là c'est pas propre je supprime pas le fichier output si le calcul échoue...
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 16h19   #6
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
Par défaut awk

Citation:
Envoyé par frp31 Voir le message
Y'a que ça des erreurs dans le batch....

Comme je te l'ai déjà dit dans les messages privés, je répète :

un batch à forcément un interpréteur en entête tu n'en as pas.
tes chemins sont tous faux "\" un chemin unix ne contient jamais de "\"
tu déclares des choses après leur usage... c'est impossible.
tu aurais au moins pu prendre 30 secondes pour regarder un exemple avant de te lancer parce que là tu aurai vu toi même que ça allait pas avant même de tenter de lancer le script

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#!/bin/sh
EX=/chemin/reel/ailleurs_possible/ex.tmp
outfile=/chemin/quelque/part/fichier
# debut du code
# extraction
gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX
if [ $? -ne 0 ]; then echo "erreur dans la commande : gawk -f /chemin/reel/vers/Extrat.awk -v $output $EX " 
exit 1
fi 
# calcul
echo "9k "$(awk '{print $16}')" 100 / " | dc > $outfile 
if [ $? -ne 0 ]; then echo "erreur dans la commande : echo \"9k \"$(awk '{print $16}')\" 100 / \" | dc > $outfile"
exit 2
fi
# purge du fichier EX
rm $EX
if [ $? -ne 0 ] ; then echo "erreur lors de l effacement de $EX"
exit 3
fi
exit 0
à minima quelque chose comme ça...
et encore là c'est pas propre je supprime pas le fichier output si le calcul échoue...
En effet, j'ai oublié de te dire que je travaille sous windows, "\" est ok pour indiquer un chemin.
# la partie d’extraction .awk marche bien, je voudrais faire des calculs décimaux sur une colonne du fichier out en gardant les restes.

Code :
1
2
3
4
set output=..\\msci\\archive\\%startdate%_%fileIn%_security.out
 
 
echo "9k "$(awk '{print $16}')" 100 / " | dc > %output%
J'ai fait des recherches dans d'autres forums, il y a des gens disant que le batch ne sait pas gérer les calculs décimaux. J
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/04/2011, 17h11   #7
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
si tu es sous windows tu as pas un shell complet je pense ... donc oublie tout usage de script unix, convertis toi à powershell (l'équivalent windows) mais là par contre je peux aucunement t'aider malheureusement. j'ai quitté le coté obscur de la gforth y'a genre 1996 donc 15 ans....
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 17h12   #8
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par debutanta Voir le message
J'ai fais des recherches dans d'autres forums, il y a des gens disant que le batch ne connait pas gérér les calcules decimaux. J
d'où l'idée d'utiliser une calculatrice "dc" desk-calculator comme programme externe pour palier à la faiblesse du shell

il faut bien comprendre que les shell, awk, sed, perl, gforth etc... sont tous des interpréteurs indépendants appelés en fonction des besoins ; on choisit les plus adaptés...et on mixe les uns et les autres à travers des "|" pour faire des traitements distincts par l'un et par l'autre pour avoir les fonctions qu'on veut au moment où on veut ... c'est l'avantage de ce système hyper souple qui interdit donc à l'utilisateur de rester sans solution...
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 18h28   #9
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

mais pourquoi utiliser dc, awk peut le faire lui-même, non ?
Code :
1
2
3
4
cat myFile
a E 30 t 350 r
awk '{printf("%.9f\n",$5 /100)}' myFile 
3.500000000
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 30/04/2011, 02h13   #10
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
ah ... ça je note... je pensais qu'awk gerait que de l'int
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h15.


 
 
 
 
Partenaires

Hébergement Web