如何从输出文件中获得平均比率

时间:2013-07-22 20:50:59

标签: bash shell average

我正在制作一个bash代码来获取服务器中的事务总数,也包括成功和失败,到目前为止这是我的输出

   TOTAL     SUCCESS    FAILED   AVERAGE SUCCESS    AVERAGE FAILED
 =====================================================================
  6139386    2079679    4059707     33.874381         66.125619

这是完美的,它还为每个事件生成一个文件,我的意思是成功交易的文件,一个用于失败的交易,一个用于所有交易

现在,从失败的事务文件中,我需要详细了解导致事务失败的错误及其频率。

我制作了这段代码

cat /tmp/test1.txt | grep "|-1|" | cut -d'|' -f34 > /tmp/test3_1.txt

ERR=$(sort test3_1.txt | uniq -c)

其中test1.txt是存储失败事务的文件,test3_1.txt是存储错误的文件

如您所见,我将此输出保存在稍后要使用的变量中,这是输出

82       -11
7241     -4
10040    1
7        10
3115778  1000
146      10002035

左边的数字是频率,右边的数字是错误代码

到目前为止,这正是我想要的,但我需要根据每个错误代码的频率和失败的交易总数制作平均比率,基本上就像这样的表

82      -11       0.002%
7241    -4        0.178%
10040   1         0.247%
7       10        0.000%
3115778 1000      76.749%
146     10002035  0.004%

基于失败的交易总数(4059707)

现在,我不知道要做的是只选择左列进行正确的计算以获得每个错误的平均比率,并将其显示在右栏中。

我到目前为止这段代码:

for i in $(awk '{print $1}' test3_1.txt) do;
AVEE=$($i * 100 | bc)

但它不起作用

1 个答案:

答案 0 :(得分:0)

这个单行将完成这项工作:

 awk '{s+=$1;i[NR]=$1" "$2;a[i[NR]]=$1}END{for(x in i)print i[x],sprintf("%.3f%", 100*a[i[x]]/s)}' file
  • 您可以更改"%.3f%以获得不同的格式。
  • 如果您想要更好的输出格式,可以awk....|column -t

这是测试:

kent$  awk '{s+=$1;i[NR]=$1" "$2;a[i[NR]]=$1}END{for(x in i)print i[x],sprintf("%.3f%", 100*a[i[x]]/s)}' file|column -t
82       -11       0.003%
7241     -4        0.231%
10040    1         0.320%
7        10        0.000%
3115778  1000      99.441%
146      10002035  0.005%

此测试是根据OP给出的不完整示例进行的(请参阅问题下的评论),结果可能与OP的输出不同。