我有一个包含多个标签的文件,旁边有一个数字,例如
<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
- 在文件中搜索以“<Overkill>”开头的行,后跟一串数字(即数字)。
- 从该行的其余部分剪下该数字。
- 将所有行之间用“+”符号连接起来
- 将结果传递给
bc
,它将计算总和