web-dev-qa-db-fra.com

Comment comparer deux nombres décimaux dans bash/awk?

J'essaie de comparer deux valeurs décimales mais je reçois des erreurs ..__ 

if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ];then

comme suggéré par l'autre fil de débordement de pile.

Je reçois des erreurs.

Quelle est la bonne façon de s'y prendre?

21
user244333

Vous pouvez le faire en utilisant le contexte numérique de Bash:

if (( $(echo "$result1 > $result2" | bc -l) )); then

bc donnera 0 ou 1 et le (( )) les interprétera respectivement comme faux ou vrai.

La même chose avec AWK:

if (( $(echo "$result1 $result2" | awk '{print ($1 > $2)}') )); then
35
Dennis Williamson
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$z" "$y"
then
  echo z not greater than y
else
  echo z greater than y
fi
8
Steven Penny

Suite de la réponse de Dennis:

Bien que sa réponse soit correcte pour les points décimaux, bash jette (standard_in) 1: erreur de syntaxe avec une arithmétique en virgule flottante.

result1=12
result2=1.27554e-05


if (( $(echo "$result1 > $result2" | bc -l) )); then
    echo "r1 > r2"
else
    echo "r1 < r2"
fi

Cela renvoie une sortie incorrecte avec un avertissement, mais avec un code de sortie de 0.

(standard_in) 1: erreur de syntaxe
r1 <r2

Bien qu’il n’existe pas de solution claire à ce problème (discussion thread 1 et thread 2 ), j’ai utilisé le correctif partiel suivant en arrondissant les résultats en virgule flottante avec awk suivi de l’utilisation de la commande bc comme dans la réponse de Dennis et ce fil

Arrondir à la décimale désirée: La suite obtiendra un espace de répertoire récursif dans TB en arrondissant à la deuxième décimale.

result2=$(du -s "/home/foo/videos" | tail -n1 | awk '{$1=$1/(1024^3); printf "%.2f", $1;}')

Vous pouvez ensuite utiliser l'arithmétique bash comme ci-dessus ou utiliser [[ ]] Enclosure comme dans thread suivant .

if (( $(echo "$result1 > $result2" | bc -l) )); then
    echo "r1 > r2"
else
    echo "r1 < r2"
fi

ou en utilisant l'opérateur -eq où la variable bc de 1 est vrai et 0 est faux

if [[ $(bc <<< "$result1 < $result2") -eq 1 ]]; then
    echo "r1 < r2"
else
    echo "r1 > r2"
fi
1
Samir
if [[ `echo "$result1 $result2" | awk '{print ($1 > $2)}'` == 1 ]]; then
  echo "$result1 is greater than $result2"
fi
1
Timor Kodal