我有一个巨大的文本文件,每一行都包含值或文本模式。
如何找到每个模式之间的平均值或至少总和值?
有 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 命令计算平均值。