7
votes

Convertir la notation scientifique en décimale à Bash

Je voudrais convertir un nombre stocké dans la notation scientifique en une décimale de point flottante, alors je peux alors effectuer des comparaisons sur les données. Ceci est fait dans un script Bash - voici un petit extrait du code:

Strong Storm From North 0039988 0017 1.0074E+05

Strong Storm From North 0037481 0018 9.9831E+04


1 commentaires

Pourquoi ne pas simplement utiliser un Perl One-Liner?


3 Réponses :


2
votes

Pour les comparaisons numériques, vous devez utiliser:

  • -eq au lieu de ==
  • -ne au lieu de ! =
  • -lt au lieu de << / code>
  • -le au lieu de <=
  • -gt au lieu de >
  • -e au lieu de > =

    et pour corriger certaines problèmes de syntaxe: xxx

    mis à jour:

    Voici comment vous convertissez-vous Un numéro de notation scientifique dans un entier: xxx

    par exemple, imprime: xxx

    et donc: xxx

    convertira landall_num de la notation scientifique dans un entier décimal normal.


9 commentaires

Je vous remercie. Juste curieux - je viens de prendre un cours de programmation de shell la semaine dernière et ils n'ont pas parlé de toutes les guillemets. Pourquoi considérez-vous cette meilleure syntaxe? Merci!


En outre, je reçois l'erreur suivante: Line 28: [[[[[[[[[[[[[[[[[[[[[: Erreur de syntaxe: Opérateur arithmétique non valide (jeton d'erreur est ".0062e + 05")


Il est presque toujours préférable d'entermer des variables dans des citations doubles pour éliminer les cas d'angle tels que des chaînes vides ou des cordes contenant de nouvelles lignes.


N'utilisez pas [[ pour les comparaisons arithmétiques, sauf lorsqu'il est combiné avec un autre type de test où il est propre à utiliser une seule commande. Normalement, utilisez (()) pour arithmétique. Bash ne manipulera pas les flotteurs, alors aucune autre approche ne fonctionnera de toute façon.


@ kimmyjo221 C'est parce que la science-notation n'a pas encore été convertie. Bash lui-même ne prend pas en charge les comparaisons de points flottants, si les entiers vont bien, voir la réponse mise à jour.


Les entiers iraient bien! Pourriez-vous décrire la commande AWK que je pourrais utiliser? Comme je l'ai dit - Très nouveau à Shell Scripting! Merci :)


Ce n'est pas un problème d'utilisation -Lt vs << / code>, c'est un problème de notations scientifiques ... Votre ligne si [["$ pres_inter" -Lt 97000]] échouera.


Et utiliser un sous-groupe pour obtenir la valeur de printf est retardé. Utilisez l'option -v ... de toute façon, j'ai déjà répondu à la question : - p


@gniourf_gniourf oh, soigné; jamais utilisé imprimer avant que j'ai appris quelque chose de nouveau aujourd'hui =)



7
votes

première chose, bash ne peut pas faire de l'arithmétique à l'aide de l'arithmétique de point flottant. Deuxièmement, Bash ne sait pas la notation scientifique (même pour les entiers).

première chose que vous pouvez essayer, si vous êtes absolument positivement sûr que tous vos numéros sont des entiers: convertir en notation décimale: printf < / le code> sera heureux cela pour vous: xxx

(%. F ronds au plus proche entier).

alors Utilisez l'arithmétique de Bash: xxx

Cette solution est merveilleuse et n'utilise aucune commande externe ni des sous-vases: vitesse et efficacité!

maintenant si vous " Regation avec des non-indépendants que vous feriez mieux d'utiliser BC pour faire l'arithmétique: mais depuis bc est retardé et ne gère pas bien avec la notation scientifique, vous devez convertir vos chiffres à la notation décimale de toute façon. Donc, quelque chose comme ce qui suit devrait faire: xxx

Bien sûr, cela est plus lent puisque vous forcez un BC . Si vous êtes heureux avec des entiers, collez-vous simplement à la première possibilité que j'ai donnée.

fait!


0 commentaires

5
votes

Je pense que la meilleure façon de le faire est d'utiliser awk. Par exemple, dans le cas du nombre "1.0074E + 05"

ECHO "1.0074E + 05" | awk -f "e" 'commence {ofmt = "% 10.10f"} {improfuez 1 * (10 ^ 2 $)}' code> p>

la sortie: p>

100740.0000000000


1 commentaires

Cela devrait être la réponse acceptée. Court et doux. Travaille aussi pour les négatifs. Maintenant, je peux avoir le prix de shib dans mon terminal :)