web-dev-qa-db-ja.com

bash / awkの2つの10進数を比較する方法は?

2つの小数値を比較しようとしていますが、エラーが発生しています。使った

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

他のStack Overflowスレッドで提案されているとおり。

エラーが発生しています。

これについて正しい方法は何ですか?

21
user244333

Bashの数値コンテキストを使用して実行できます。

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

bcは0または1を出力し、(( ))は、それらをそれぞれfalseまたはtrueとして解釈します。

AWKを使用した同じこと:

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

デニスの返信のフォローアップ:

彼の応答は小数点に対しては正しいですが、bashは(standard_in)1:浮動小数点演算で構文エラーをスローします。

result1=12
result2=1.27554e-05


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

これは、終了コードが0であるにもかかわらず、警告とともに誤った出力を返します。

(standard_in)1:構文エラー
r1 <r2

これに対する明確な解決策はありませんが(議論 スレッド1 および スレッド2 )、次の部分的な修正を使用し、awkを使用して浮動小数点の結果を四捨五入しました。デニスの返信のようにbcコマンドを使用し、 このスレッド

希望の小数点以下の桁数に丸める:以下は、TBの小数点以下2桁を丸めて、再帰的なディレクトリスペースを取得します。

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

次に、上記のようにbash算術を使用するか、 スレッドの追跡 のように[[ ]]エンクロージャーを使用できます。

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

または-eq演算子を使用して、1のbc出力はtrueであり、0はですfalse

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