Awk 哎哟-什么事啊!i++;做

Awk 哎哟-什么事啊!i++;做,awk,gawk,Awk,Gawk,我有以下代码部分: if (substr($12,match($12,":")+1,match($12,")")-15) == "TelegramHandlerECHLane") { $11 ~ /ms/ ( SUM10 += $11) !i++ (min = $11) !i++ (max = $11) { for (j= NR; j&

我有以下代码部分:

 if (substr($12,match($12,":")+1,match($12,")")-15) == "TelegramHandlerECHLane") {
                $11 ~ /ms/ ( SUM10 += $11)
                !i++ (min = $11)
                !i++ (max = $11)
                {
                for (j= NR; j<= FNR; ++j) {
                min10 = (min < $11 ? min : $11)
                max10 = (max > $11 ? max : $11)
                                          } #End of for
                                } #End of for wrapper
                }
返回的输出示例如下:

TelegramHandlerPackingInfeedHanging
MIN: 19.7ms
MAX: 19.7ms
AVG: 3.05067ms
TelegramHandlerPackingAreaNOK
MIN: 25.3ms
MAX: 25.3ms
AVG: 0.00706937ms
TelegramHandlerPackingAreaMPANOK
MIN: 22.3ms
MAX: 22.3ms
AVG: 4.26834e-05ms
TelegramHandlerPackingOrderBufferHanging
MIN: 12.0ms
MAX: 12.0ms
AVG: 1.60741ms
TelegramHandlerTUNotification
MIN: 8.7ms
MAX: 8.7ms
AVG: 4.00978ms
TelegramHandlerLaneStatusLaneLocker
MIN: 15.0ms
MAX: 15.0ms
AVG: 0.0527127ms
TelegramHandlerPackingHangingBufferLane
MIN: 23.9ms
MAX: 23.9ms
AVG: 13.3463ms
TelegramHandlerLaneStatusHangingMPA
MIN: 312.5ms
MAX: 312.5ms
AVG: 0.0126846ms
TelegramHandlerMPAHangingBufferLane
MIN: 57.0ms
MAX: 57.0ms
AVG: 0.135032ms
TelegramHandlerECHLane
MIN: 7.0ms
MAX: 7.0ms
AVG: 2.81495ms

这部分是在做我想做的事情。返回消息,
substr($12,match($12,“:”)+1,match($12,“)”)-15)
以及
min
处理时间、
max
处理时间和
AVG
处理时间。尽管
min
max
的值是相同的,所以我认为这些值是被覆盖的,而不是被单独计算出来,并保存到变量min01-min10、max01-max10、SUM01-SUM10中。

这是真正的awk代码吗?因为它看起来确实不像

如果您看到以下内容:

!i++      { min = $11 }
$11 < min { min = $11 }
!i++{min=$11}
$11
(在最高层),那么这只是一种模糊处理;这意味着:

{ if (NR==1 || $11 < min) min = $11; }
{if(NR==1 | |$11
或同等地

NR == 1 || $11 < min  { min = $11; }
NR==1 | |$11
换句话说,如果您在第一行,或者如果第11个字段小于
min
的当前值,则将
min
设置为第11个字段的值。在
中!i++
i++
递增
i
,但返回原始未递增值作为传递给
的值,这意味着整个表达式:

  • 无条件递增
    i
  • 如果在增量之前
    i
    为0或未初始化,则为true

编写它的人试图将其最小和最大变量初始化为第一个看到的值,并被awk的通用
{}
语法在动作块中不适用所迷惑

记住:
i
以值零开始,然后
!i
为1,
i++
为后期增量,因此
!第一次遇到i++
也是1,但是第二次
i
也是1,所以
!i++
为零,第三次i为2和
!i++
仍然为零,以此类推

这就是他们想写的:

 if (substr($12,match($12,":")+1,match($12,")")-15) == "TelegramHandlerECHLane") {
                if ($11 ~ /ms/) {SUM10 += $11}
                if (!i++) {min = $11; max = $11}
                {
                for (j= NR; j<= FNR; ++j) {
                min10 = (min < $11 ? min : $11)
                max10 = (max > $11 ? max : $11)
                                          } #End of for
                                } #End of for wrapper
                }
if(substr($12,match($12,“:”)+1,match($12,“)”)-15)=“TelegramHandlerECHLane”){
如果($11~/ms/){SUM10+=$11}
如果(!i++){min=$11;max=$11}
{
对于(j=NR;j$11?最大值:$11)
}#结束
}#包装器的端部
}

但它仍然没有真正意义。

此代码打算将
min
max
值初始化为遇到的第一个值

作者认为
!i++(min=$11)
相当于

if (!i) {
    i++
    min=$11
}

如果使用
,情况将是如此!i++&(min=$11)

A.您是否可以确认此代码有效并提供可靠的结果?或者可能是从未执行过的孤立代码?B.看看
i
的值在更大的上下文中是如何使用的,这将非常有帮助。这两行是
!i++
唯一的地方?C.其他奇怪的语法让我认为最初的作者不是本地的
awk
说话者,但这部分取决于一个人何时开始使用
awk
。所有这些都是在说,“只是在寻找线索”。我想您可以添加调试来显示
I
(在设置之前)的值!(空)VS!(value)但我不知道如何将其用作条件。祝你好运AFAICT,GNU
awk
接受它,但BSD(MacOSX)
awk
不接受。它看起来就像是写的
!i++(min=$11)
相当于
如果(!i++)min=$11
。这意味着如果
i
为零,那么
min
将被设置为
$11
中的值。
!i++(max=$11)
行让我困惑;前一行递增
i
,因此这永远不会是真的。包装的
for
循环也是深奥的;它在第一个文件中每输入一行执行一次主体,之后不再执行。代码非常痛苦-应该重写它以明确它在做什么。@JonathanLeffler:BSD awk正在抱怨正则表达式中不匹配的
”。如果将其更改为
“[)]”
,则错误应消失。看起来他们确实希望能够使用语句
guard(action)
来类比
guard{action}
,但当然awk(gawk和BSD-awk)解释
!i++(min=$11)
作为0或1与
$11
的字符串串联,同时将
min
设置为
$11
作为副作用;awk不会抱怨无用的评估。我可以大胆地说我不是一个
awk
演讲者。我试着在几乎没有睡眠的情况下12小时轮班写这篇文章。我会在一分钟内用完整的脚本更新原始问题+提供我得到的输出。我可以看到它正在做我“想要”它做的事情,但它只是看起来有点奇怪。(摘自谷歌)@glennLynam:如果你写了那段代码,那么我会说,你最好在轮班的前十个小时阅读或其他一些东西,之后你可能可以在剩下的两个小时内编写程序。这可能是为了达到相同的效果,但肯定不是。
if (!i) {
    i++
    min=$11
}