排序uniq字符串,创建列并求平均值 [英] Sorting uniq strings, creatings columns and averaging

查看:74
本文介绍了排序uniq字符串,创建列并求平均值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

输入文件:

civil   4
posición    3
formación   7
posición    5
domingo 1
retrato 5
retrato 6
civil   6
formación   3
retrato 7
domingo 7
media   1
media   1

我希望输出为:

civil   4   domingo 1   formación   3   media   1   posición    3   retrato 5
 civil  6   domingo 7   formación   7   media   1   posición    5   retrato 6
average#    average#    average#        average#    average#        retrato 7
                                                                    average#

所以我可以做sort -t","来获取原始输入为

so I can do sort -t"," to get the original input as

civil   4
civil   6
domingo 1
domingo 7
formación   3
formación   7
media   1
media   1
posición    3
posición    5
retrato 5
retrato 6
retrato 7

和类似awk '{x+=$insertcolumn} END { for (x> 0) print x/NR }'的东西来获取平均值,但是如何在中间步骤中获取列格式?

and something like awk '{x+=$insertcolumn} END { for (x> 0) print x/NR }' to get the averages but how do I get the column format in the middle step?

推荐答案

$ cat tst.awk               
BEGIN { nw=length("average"); vw=1 }
!seenCnt[$1]++ { keys[++numKeys]=$1 }
{
    vals[$1,seenCnt[$1]] = $2
    nw = (length($1) > nw ? length($1) : nw)
    vw = (length($2) > vw ? length($2) : vw)
    numRows = (seenCnt[$1] > numRows ? seenCnt[$1] : numRows)
}
END {
    for (rowNr=1; rowNr<=(numRows+1); rowNr++) {
        for (keyNr=1; keyNr<=numKeys; keyNr++) {
            key = keys[keyNr]
            name = val = ""
            if ( (key,rowNr) in vals ) {
                name = key
                val  = vals[key,rowNr]
                sum[key] += vals[key,rowNr]
            }
            else if (key in sum) {
                name = "average"
                val  = sum[key]/(rowNr-1)
                delete sum[key] 
            }
            printf "%-*s %*s%s", nw, name, vw, val, (keyNr<numKeys?OFS:ORS)
        }
    }
}

.

$ sort file | awk -f tst.awk
civil     4 domingo   1 formación 3 media     1 posición  3 retrato   5
civil     6 domingo   7 formación 7 media     1 posición  5 retrato   6
average   5 average   4 average   5 average   1 average   4 retrato   7
                                                            average   6

这篇关于排序uniq字符串,创建列并求平均值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆