#!/bin/bash
q=$(bc <<< "scale=2;$p*100")
head -n$q numbers.txt > secondcoordinate.txt
これはスクリプトの一部にすぎませんが、私の意図を説明するのに十分だと思います。p
は小数点以下の2桁しかない変数なので整数でなければなりませんq
...たとえば、代わりに表示されますbc
。10.00
10
この問題をどのように解決できますか?
答え1
scale=0
規模が決まる方法のため、明らかな内容ではこれを行うことはできません。
ドキュメントでは、1 で割るだけで出力を match にリセットするのに十分で、デフォルトはscale
0 と間接的に説明します。
式1/式2式の結果は両方の式の商です。結果の尺度は変数尺度の値です。
p=12.34; echo "($p*100)" | bc
1234.00
p=12.34; echo "($p*100)/1" | bc
1234
bc
あなたのバージョンがそれを処理できない場合は、sed
代わりにパイプしてください。
p=12.34; echo "($p*100)" | bc | sed -E -e 's!(\.[0-9]*[1-9])0*$!\1!' -e 's!(\.0*)$!!'
1234
この RE ペアは、数値の小数部から末尾のゼロを削除します。したがって、3.00は3に減少し、3.10は3.1に減少しますが、300はそのまま残ります。
または最初に使用perl
して廃棄します。bc
p=12.34; perl -e '$p = shift; print $p * 100, "\n"' "$p"
答え2
awk を使用して値を計算できます。
bash-3.2$ p=0.01
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
1
bash-3.2$ p=0.02
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2
bash-3.2$ p=0.022
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2.2
答え3
長い話を短く
あなたには多くの選択肢があります。紀元前既知の動作がscale=0
常に期待したものとは異なりますが、回避策はたくさんあります。以下はいくつかあります。
印刷機能
使用印刷機能出力を整数に制限します。
$ printf "%g\n" $(echo '12.34 * 100' | bc)
1234
BCと除算
持続したい場合紀元前サイズを変更するには、サイズを0に指定する必要があります。そしてスケールをリセットするには1で割ります。これは既知の動作ですが、実際に理由を説明することはできません。
$ echo '12.34 * 100 / 1' | scale=0 bc
1234
sed
不要な末尾の文字を削除します。
$ echo '12.34 * 100' | bc | sed 's/\.00$//'
1234
強く打つ
小数点の前の値を返すには、中かっこ拡張を使用します。
$ p='12.34'; q=$(bc <<< "scale=2; $p*100"); echo ${q%%.00}
1234
答え4
これは末尾のゼロを削除するbash関数です。
remove_trailing_zeroes()
{
declare -n n="$1"
# Prepend a 0 if number starts with a dot.
if [[ $n =~ ^[.] ]]; then
n="0$n"
fi
# Remove trailing zeroes
while [[ $n =~ [.].*0$ ]]; do
n="${n%0}"
done
# Remove trailing dot if any
if [[ $n =~ [.]$ ]]; then
n="${n%.}"
fi
}
その後、次のようにあなたの場合に使用できます。
q=$(bc <<< "scale=2;$p*100")
remove_trailing_zeroes q
head -n$q numbers.txt > secondcoordinate.txt