【问题标题】:how to use awk to calculae the median values in column 2, with column 1 has repeated rows?如何使用 awk 计算第 2 列中的中值,第 1 列有重复行?
【发布时间】:2014-04-29 12:40:12
【问题描述】:

我有一个如下文件:

1 , 2.0
1 , 59.0
1 , 0.3
2 , 4.5
2 , 2.3
3 , 15.4
4 , 82.4
4 , 5.7
4 , 9.0 

我想在列重复时找到第 2 列的中位数,所需的输出如下:

1 , 2.0
2 , 3.4
3 , 15.4
4 , 9.0

我如何使用 awk 和 sort 来做到这一点?非常感谢!

【问题讨论】:

    标签: sorting awk multiple-columns median


    【解决方案1】:

    这是awk 的一种方式。

    median.awk 的内容

    BEGIN { FS = OFS = " , " }
    function find_med(count, med) {
        if(count == 1) {
            return med[1];
        } 
        else if(count == 2) {
            return ((med[1] + med[2]) / 2);
        } 
        else {
           return med[sprintf("%0.f",((count / 2) + 1))];
        }
    }
    NR>1 && $1 != seen {
        median = find_med(cnt, total);
        print seen, median;
        delete total;
        cnt = 0
    }
    {
        seen = $1;
        total[++cnt] = $2;
    }
    END {
        median = find_med(cnt, total);
        print seen, median;
    }
    

    运行如下:

    $ awk -f median.awk <(sort -nk1,1 -k2,2 -t',' file)
    1 , 2.0
    2 , 3.4
    3 , 15.4
    4 , 9.0
    

    【讨论】:

    • 真正的爱的劳动,+1!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多