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,GNUawk
接受它,但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
}