Awk 如何打印每行剩余部分的最大值和平均值
使用awk可以这样打印吗 输入 输出Awk 如何打印每行剩余部分的最大值和平均值,awk,Awk,使用awk可以这样打印吗 输入 输出 t1 t2 t3 t4 tn max avg.of.rest l1 0 0.1448 0.2295 0.2896 0.3362 0.3362 0.166 l3 0.1395 0.1395 0.1395 0.1395 0.4421 0.4421 0.140 l4 0.5779 0.138 0.09591 0.0501
t1 t2 t3 t4 tn max avg.of.rest
l1 0 0.1448 0.2295 0.2896 0.3362 0.3362 0.166
l3 0.1395 0.1395 0.1395 0.1395 0.4421 0.4421 0.140
l4 0.5779 0.138 0.09591 0.05014 0.138 0.5779 0.114
$cat tst.awk
开始{OFS=“\t”;OFMT=“%.3f”}
NR==1{
打印$0,“最大值”,“剩余平均值”
下一个
}
{
最高=2美元
对于(i=3;i最大值?$i:max)
}
tot=cnt=0
对于(i=2;我认为你所说的“最小值的平均值”实际上是“其余数字的平均值”因为最小值的平均值是最小值,第一行中的最小值是零。如果是这样,请编辑您的问题以解决这个问题。另外,为每一行示例输入添加预期输出。没有一行没有另一行,没有任何意义。等等-如何计算“最小”值的平均值(0.4467
)大于最大值(0.3362
)编辑你的问题,以澄清和/或修复错误。现在有错误。SyryOK,现在改变一个输入行,使最大值出现两次,并显示该情况下的预期输出。您可能还需要添加一个行,其中所有的值都为零,这是人们通常不考虑并导致除以E的情况。当它发生时会出错。负数呢?平均值来自哪个数字???@Ed Morton。是的,你是对的。在此之前,我写了一个脚本,删除了所有有零的行。我没有任何数字,因为我对它们进行了log2变换。@JID.Mean来自每行的所有值,但最大值除外了解OP想要从你的答案中做的比他们的问题更多的事情哈!+1嗨,我正在传递你的脚本,用平均值除以max。但是我没有得到输出中的标题。任何建议都将不胜感激。我喜欢这个awk'NR>1{if($NF>0)print$0“\t”$(NF-1)/$NF;else print$0“\t”$(NF-1)}对不起,我不知道你在说什么。也许你应该发布一个新问题?
t1 t2 t3 t4 tn max avg.of.rest
l1 0 0.1448 0.2295 0.2896 0.3362 0.3362 0.166
l3 0.1395 0.1395 0.1395 0.1395 0.4421 0.4421 0.140
l4 0.5779 0.138 0.09591 0.05014 0.138 0.5779 0.114
$ cat tst.awk
BEGIN { OFS="\t"; OFMT="%.3f" }
NR==1 {
print $0, "max", "avg.of.rest"
next
}
{
max = $2
for (i=3;i<=NF;i++) {
max = ($i > max ? $i : max)
}
tot = cnt = 0
for (i=2;i<=NF;i++) {
if ($i != max) {
tot += $i
cnt++
}
}
print $0, max, (cnt?tot/cnt:0)
}
$ awk -f tst.awk file
t1 t2 t3 t4 tn max avg.of.rest
l1 0 0.1448 0.2295 0.2896 0.3362 0.3362 0.166
l3 0.1395 0.1395 0.1395 0.1395 0.4421 0.4421 0.140
l4 0.5779 0.138 0.09591 0.05014 0.138 0.5779 0.106