【问题标题】:how to get average ratio from an output file如何从输出文件中获取平均比率
【发布时间】:2013-07-22 20:50:59
【问题描述】:

我正在编写一个 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)

但是没用

【问题讨论】:

  • 你有什么输入,你想要什么输出? cmd 输出!= 4059707 第一列的总和。可以吗?或者我没有正确理解。
  • 我的putput是第一个表(2列),我想要的是第二个(3列)。 4059707 是失败交易的总数
  • 请解释一下,从你的第一个表,我如何才能得到4059707的号码?
  • 它来自事务日志,它整天都在更新,并且永远不会相同,对于这个例子,我在第一个表上采用了我运行脚本来测试的输出之一,其中你有所有(总,成功,失败,平均成功,平均失败)你从失败列中得到数字
  • 我不知道您是否阅读了我的第一条评论。如果第一列的总和应该 ` = 4059707, your cmd to get the **first table** (the cat|grep|cut|sort|uniq) would have problem. because the sum != 4059707`

标签: bash shell average


【解决方案1】:

这个单线就可以完成这项工作:

 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 给出的不完整的例子上进行的(见问题下的 cmets),结果可能与 OP 的输出不同。

【讨论】:

  • 我试过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)}' "$ERR"|column -t但没用
  • @AntonioPerezOseguera 你的 $ERR 不是文件,你不能用 awk 做到这一点。你可以echo "$ERR"|awk ...|column -t
  • 抱歉耽搁了,我在评论您的答案后发现它不适用于变量。它现在实际上工作得很好,只是,作为一个忙,你能解释一下代码吗?!我正在努力学习并避免提出像这样的愚蠢问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多