模式之间的总和平均值

模式之间的总和平均值

我有一个巨大的文本文件,每一行都包含值或文本模式。

如何找到每个模式之间的平均值或至少总和值?

有 awk/sed 或者 perl 解决方案吗?

例子:

pattern1
200
300
pattern2
200
100
200
pattern3
pattern4

预期输出:

pattern1
250
pattern2
166
pattern3
pattern4

答案1

Awk方法:

awk '/pattern/{ if (cnt) { printf "%d\n", sum/cnt; sum=cnt=0 } print }
     /^[0-9]+$/{ sum += $1; cnt++ }' file

输出:

pattern1
250
pattern2
166
pattern3
pattern4

答案2

使用 Gnu 工具 sed n dc 我们可以这样做:

$ sed -re '
    /^[0-9]+$/,/pattern/!b
    /^[0-9]+$/{H;d;}
    x;y/\n/ /
    s#.*#dc -e "0dsn&[+ln1+snz1<+]s+l+xln/p"#ep
    z;x
' file

结果:

pattern1
250
pattern2
166
pattern3
pattern4

假设尾随行不能是数字。还假设没有负数。

我们在 sed 中设置一个范围来查找仅包含要模式的数字的行。在此之外,所有内容均按原样打印。这些数字被附加到 Hold nd 中,然后使用 dc 实用程序使用 gnu sed 的 s///e 命令计算平均值。

相关内容