0

我想接受以下输入

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

...打印舍入到某个数字的第一个数字(平均值),其中该数字由 ROUNDED 标准的第一个有效数字定义。开发。

例如 --> Rounded Std 0.003 <-- (所以第三个数字)
--> 0.521 (在这种情况下)

给出一个边界情况:
Average Box 1: 0.52156 Std. Dev. Box 1: 0.0099675
--> Rounded Std 0.01 <-- (所以第二个数字)
--> 0.52 (在这种情况下)

我可以通过某种方式的 Awk 魔法来完成这一切吗?如果是这样,怎么做?如果没有,我可以用什么来做(我最后的手段是 C 程序,但 shell 程序似乎更有效)?

(这是用于研究项目的数据提取,又名 /nothomework。)

4

1 回答 1

3

这是一种方法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 回答