Bashを使用して次の作業を実行する必要があります。エレガントな方法は何ですか?最終的な $sum 値を取得します。
worker_machine=32
executors_per_node=3
executer=$worker_machine/$executors_per_node-1
spare=$executer X 0.07
sum=$executer-$spare ( with round the number to down )
example:
32/3 = 10 - 1 = 9
9 X 0.7 = 0.6
9 – 0.6 = 8 ( with round the number to down )
答え1
を使用してawk
シェル変数から値を取得します。
awk -v n="$worker_machine" -v m="$executors_per_node" \
'BEGIN { printf("%d\n", 0.93 * (n / m - 1)) }' /dev/null
スクリプトawk
は通常どおり入力を受け取らないため、/dev/null
ファイルを入力として使用し、ブロック単位で計算と出力を実行しますBEGIN
。
使用bc
:
sum=$( printf '0.93 * (%d / %d - 1)\n' "$worker_machine" "$executors_per_node" | bc )
printf '%.0f\n' "$sum"
使用dc
:
sum=$( printf '%d\n%d\n/\n1\n-\n0.93\n*\np\n' "$worker_machine" "$executors_per_node" | dc )
printf '%.0f\n' "$sum"
答え2
シェルは数学演算(整数、半減)を実行できます。
$ sum=$(( ( worker_machine/executors_per_node-1 ) * 93 / 100 ))
$ echo "$sum"
8
bcのデフォルトの小数点以下の桁数は0なので、除算の結果は整数になります。
$ sum=$(bc <<<"($worker_machine / $executors_per_node - 1)*93/100")
$ echo "$sum"
8
私たちは整数が欲しいので、awkに整数を要求できます。
$ sum=$(awk -v m="$worker_machine" -v n="$executors_per_node" 'BEGIN{ print( int((m/n-1)*93/100) )}' /dev/null)
$ echo "$sum"
8