0

次のように、行がエラーのある値であるデータ テキスト ファイルがいくつかあります。

...
6  90.3785794742981 0.0952997386139722
40 1028.46336161948 4.41798447319325
...

3 列目は 2 列目に対する相対誤差です。より人間が読める形式で出力するスクリプトを書きたいと思います。つまり、正しい有効桁数で値を出力し、括弧の間の最後の 2 桁にエラーを出力します。次のようにします。

...
6  90.379(95)
40 1028.5(4.4)
...

printf正規表現を使用して数値を抽出すると、ドットの処理が難しく、数値を近似するのではなく切り捨てるため、正しく機能しませんbc

このために書いたコードは次のとおりです

#! /bin/bash
while read a v verr
do
    ov=`printf %e $v`
    ov=${ov/*e/}
    overr=`printf "%e" $verr`
    overr=${overr/*e/}
dov=$((1-$overr))
v=`echo "scale=0;$v*10^($dov)" | bc -l`
v=`printf %.0f $v`
printf "$a %f(%.0f)\n" `echo "lenght=length($v);$v*10^($((-$dov)))" | bc -l` `echo "$verr*10^($dov)" | bc -l`
 done < myfile.txt

私が得るものは

6 90.379000(95)
40 1028.500000(44)

私のコードは、末尾のゼロの出現を除いて、ほとんど機能します。

どうすればそれらを取り除くことができますか? それらの数は固定されておらず、それらをすべて切り取ると、最後の桁が実際にゼロである場合にエラーが発生するため、それらを切り取るだけでは良くありません.

4

2 に答える 2

0

sed コマンドを使用しても問題ない場合は、printf の後に sed ステートメントを追加して、末尾のゼロを削除できます。

printf "$a %f(%.0f)\n" `echo "lenght=length($v);$v*10^($((-$dov)))" | bc -l` `echo "$verr*10^($dov)" | bc -l` | sed 's/00*(/(/'
于 2012-10-12T15:47:22.367 に答える
0

次のコードが機能します。

#! /bin/bash
while read a v verr
do
ov=`printf %e $v`
    ov=${ov/*e/}
    overr=`printf %e $verr`
overr=${overr/*e/}
dov=$((1-$overr))
v=`echo "scale=0;$v*10^($dov)" | bc -l`
v=`printf %.0f $v`

if [ $dov -gt 0 ]; then
    # remember bc doesn't understand numbers in scientific notation,
    # therefore we need to convert such numbers in regular notation.
    u=`echo ${u} | sed 's/[eE]/\\*10\\^/' | sed 's/+//'`
    verr=`echo ${verr} | sed 's/[eE]/\\*10\\^/' | sed 's/+//'`

    u=`echo "$v*10^($((-$dov)))" | bc -l`
    if [ $overr -eq 0 ]; then
    uerr=`echo "$verr*10^($dov - 1)" | bc -l`
    printf "$a\t%.${dov}f(%.1f)\n" $u $uerr>>$s
    else
    uerr=`echo "$verr*10^($dov)" | bc -l`
    printf "$a\t%.${dov}f(%.0f)\n" $u $uerr>>$s
    fi
else
    echo $a "${v}(${verr})E$ov">>$s
fi
done < $f

必要に応じてフォーマットされた値を出力します。最初のケースは、有効桁数を正しく取得するために結果を指数表記で表現する必要があるかどうかをテストし、2 番目の if ケースは、エラーにドットを入れるかどうかをテストします。

下から 3 行目のコードは今は必要ないのでテストしていません。動作しない可能性があるので注意してください。

編集:科学表記法番号を処理するために 2 つの sed 呼び出しを挿入しました。

于 2012-10-13T10:20:29.073 に答える