特定模式旁边的总和值

特定模式旁边的总和值

我有一个包含多个标签的文件,旁边有一个数字,例如

<Overall>4
other <tags> and data
<Overall>2
other <tags> and data
<Overall>3

我如何搜索文件并计算整个标签旁边的所有数字?然后将这个数字除以总体标签的数量,得到总体平均值。

例如,在上面的代码中,平均值为 3。

然后循环遍历当前目录中的所有文件并列出每个文件的总体平均值。

答案1

使用 awk (假设所有行上都是那个和一个数字)

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print "AVG:",y/x}' file

x 会随着任何成功的 sub 的增加而增加<Overall>。这意味着它仅在包含 的行上递增<Overall>

然后,后面的块将行中剩余的数字添加到总数中。

END在程序末尾执行。

在最后的块中打印平均值。

编辑:对于很多文件

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print FILENAME,"AVG:",y/x}' LISTOFFILES

答案2

perl

perl -lne 'for (/<Overall>([\d.eE+-]+)/g) {$n++; $sum += $1}
           END{print $sum/$n if $n}'

<Overall>这样做的好处是每行能够处理多个标签。[\d.eE+-]+是浮点十进制数的粗略匹配器(允许诸如 12、1.2、-1E+20 之类的东西(尽管也不是有效数字))。

答案3

这是 awk 中的一个粗略方法:

awk '/^<Overall>/ { 
    sub("<Overall>", ""); 
    sum += $1; 
    lines++; 
  } 
  END { print sum / lines}' 
  tags  ### this is your input file

答案4

这是使用一些漂亮实用程序的解决方案:

grep "^<Overall>\d\+" file | cut -c 10 | paste -s -d + - | bc
  1. 在文件中搜索以“<Overkill>”开头的行,后跟一串数字(即数字)。
  2. 从该行的其余部分剪下该数字。
  3. 将所有行之间用“+”符号连接起来
  4. 将结果传递给bc,它将计算总和

相关内容