-1

我有两列:

100011780   100016332  
10100685    10105465      
101190948   101195542  
101286838   101288018  
101411746   101413662  
101686767   101718138  
101949793   101950504  
101989424   101993757  
102095320   102106147  
102133372   102143125

我想得到这些数字的中间值。
试着:

awk '{print $1"\t"$2-$1}' input | awk '{print $1"\t"$2/2}' | awk '{print $1+$2}' > output

但是除以 2 后的一些数字不再自然,可能我的输出是这样的:

100014056
10103075
101193245
101287428
101412704
1.01702e+08
1.0195e+08
1.01992e+08
1.02101e+08
1.02138e+08

也许可以找到非自然值和 -/+ 0.5 使其自然?

4

3 回答 3

3

您当然不需要调用 awk 3 次来获得两个数字的平均值。

awk '{printf("%d\n", ($1+$2)/2)}' input

用于printf()控制输出。

100014056
10103075
101193245
101287428
101412704
101702452
101950148
101991590
102100733
102138248
于 2012-09-18T22:18:49.150 回答
2

您可以在 AWK 文件中添加和使用此轮函数:

function round(x) {
    ival = int(x);

    if (ival == x)
            return x;

    if (x < 0) {
            aval = -x;
            ival = int(aval);
            fraction = aval - ival;
            if (fraction >= .5)
                    return int(x) - 1;
            else
                    return int(x);
    } else {
            fraction = x - ival;
            if (fraction >= .5)
                    return ival + 1;
            else
                    return ival;
    }
}

例如,平均值将是:

{print round(($1+$2)/2)}
于 2012-09-18T22:21:37.573 回答
2

当总和不均匀时不确定您想要什么,但您可以一次性完成所有操作:

gawk '{printf "%i\n", ($1 + $2) / 2}' input

您正在寻找的是printf的格式控制选项。

于 2012-09-18T22:27:27.283 回答