it-swarm.com.de

Wie kann man zwei Dezimalzahlen in bash/awk vergleichen?

Ich versuche, zwei Dezimalwerte zu vergleichen, aber ich bekomme Fehler ... Ich habe verwendet 

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

wie vom anderen Stack Overflow-Thread vorgeschlagen.

Ich bekomme Fehler.

Was ist der richtige Weg, dies zu tun?

21
user244333

Sie können dies mit dem numerischen Kontext von Bash tun:

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

bc gibt 0 oder 1 aus und der (( )) interpretiert sie als falsch bzw. wahr.

Dasselbe bei AWK:

if (( $(echo "$result1 $result2" | awk '{print ($1 > $2)}') )); then
35
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

Im Anschluss an Dennis 'Antwort:

Obwohl seine Antwort für Dezimalpunkte korrekt ist, wirft bash (standard_in) 1: Syntaxfehler mit Gleitkomma-Arithmetik.

result1=12
result2=1.27554e-05


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

Dies gibt eine falsche Ausgabe mit einer Warnung zurück, jedoch mit einem Beendigungscode von 0.

(standard_in) 1: Syntaxfehler
r1 <r2

Es gibt zwar keine eindeutige Lösung (Diskussion Thread 1 und Thread 2 ), jedoch habe ich die folgende teilweise Korrektur angewendet, indem Gleitkommazahlen mit awk gerundet wurden, gefolgt von der Verwendung des bc-Befehls wie in Dennis's Antwort und dieser Thread

Auf eine gewünschte Dezimalstelle aufrunden: Nachfolgend erhalten Sie rekursiven Verzeichnisbereich in TB mit Abrundung an der zweiten Dezimalstelle.

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

Sie können dann die Bash-Arithmetik wie oben verwenden oder [[ ]] Enclosure wie in following thread verwenden.

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

oder mit -eq Operator, wobei bc Ausgabe von 1 true und 0 false ist

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