假设我有一个像这样的日志文件(第一列是时间戳):
1699740442177 Start A
1699740442177 Start B
1699740442255 Start C
1699740442261 Finish B
1699740442337 Finish C
1699740442337 Finish A
Run Code Online (Sandbox Code Playgroud)
A我想确定、B和平均花费了多少时间C。所以我写了一个awk脚本:
/Start A/ {
startA = $1
}
/Finish A/ {
sumA += $1 - startA
numA++
}
/Start B/ {
startB = $1
}
/Finish B/ {
sumB += $1 - startB
numB++
}
/Start C/ {
startC = $1
}
/Finish C/ {
sumC += $1 - startC
numC++
}
END {
print sumA/numA, sumB/numB, sumC/numC
}
Run Code Online (Sandbox Code Playgroud)
该脚本可以工作,但有点样板。您建议如何改进脚本并减少样板?
字母数量可能有所不同(最多 10-15 个字母)。Start/Finish我们可以假设同一字母对之间没有重叠。
您可以将起始时间戳、绝对总和和计数存储到数组中,所有这些都由第三列索引,并在以下位置打印出平均值END:
$2 == "Start" { t[$3] = $1; n[$3] += 1 }
$2 == "Finish" { s[$3] += $1 - t[$3] }
END { for (k in n) print "Average of", k, "is", s[k] / n[k] }
Run Code Online (Sandbox Code Playgroud)
Average of A is 160
Average of B is 84
Average of C is 82
Run Code Online (Sandbox Code Playgroud)