0

次の入力をしたい

Average Box 1: 0.520522 Std. Dev. Box 1: 0.00297154

...特定の桁に丸められた最初の数値(平均)を出力します。この桁は、ROUNDEDstdの最初の有効桁によって定義されます。開発者

例->RoundedStd 0.003 <-(3桁目)
-> 0.521(この場合)

ボーダーケースを指定するには:
Average Box 1: 0.52156 Std. Dev. Box 1: 0.0099675
-> Rounded Std 0.01 <-(2桁目)
-> 0.52(この場合)

なんらかの方法でAwkの魔法を使ってこれをすべて行うことはできますか?もしそうなら、どのように?そうでない場合、私はそれを行うために何を使用できますか(私の最後の手段はCプログラムですが、シェルプログラムの方が効率的です)?

(これは、研究プロジェクト、別名/ nothomeworkでのデータ抽出用です。)

4

1 に答える 1

3

これが の 1 つの方法awkです。

内容を仮定するinfileと:

Average Box 1: 0.520522 Std. Dev. Box 1: 0.00297154
Average Box 1: 0.52156 Std. Dev. Box 1: 0.0099675

次のスクリプトを実行します。

awk '
    ## For every line...
    { 
        ## Get number in form "[-]d.dddddde[+-]dd."
        num = sprintf( "%e", $NF ); 
        e = num;

        ## Get exponent.
        sub( /^.*e-/, "", e ); 

        ## Get the decimal number without zero digits at the beginning.
        sub( /e.*$/, "", num ); 

        ## Round the number.
        num = int(num+0.5);

        ## Apply the exponent to this no-fractional rounded number 
        for ( i = 1; i <= int(e); i++ ) {
            num = num / 10;
        }

        ## Get the position of the digit in the decimal number.
        ## Examples:
        ## If number is 0.003 the position will be two below its length
        ## Same if number is 0.01,
        ## etc.
        num = length(num) - 2;

        ## Print rounded floating point number
        printf( "%." num "f\n", $4 ) 
    }
' infile

これにより、次の結果が得られます。

0.521
0.52
于 2012-10-02T20:56:52.417 に答える