排序uniq字符串,创建列并求平均值 [英] Sorting uniq strings, creatings columns and averaging
本文介绍了排序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屋!
查看全文