你会想要这样的东西:
$ cat tst.awk
BEGIN { FS="[ :]" }
{ sum[$6,$2]+=$7; msgs[$6]; hrs[$2] }
END {
for (msg in msgs) {
print msg
for (hr in hrs) {
print hr, sum[msg,hr]+0
}
print ""
}
}
$ awk -f tst.awk file
Message1
00 12
01 13
Message2
00 50
01 10
但显然这有点猜测,因为它是针对您发布的示例输入运行的,但您没有提供相关的预期输出。
顺便说一句,问题主题行AWK - Is it possible...
,假设它是关于操纵文本,那么该问题的答案始终是“是”,因此无需询问是否可能。
我刚刚注意到你之前的问题,你说时间可能并不总是出现在你的数据中,所以这可能是你真正想要的:
$ cat tst.awk
BEGIN { FS="[ :]" }
{ sum[$6,$2+0]+=$7; msgs[$6] }
END {
for (msg in msgs) {
print msg
#for (hr=0; hr<=23; hr++) {
for (hr=0; hr<=4; hr++) {
printf "%02d %d\n", hr, sum[msg,hr]
}
print ""
}
}
$
$ awk -f tst.awk file
Message1
00 12
01 13
02 0
03 0
04 0
Message2
00 50
01 10
02 0
03 0
04 0
显然将“4”更改为“23”。我还建议您考虑使用 CSV 输出,以便可以导入到 Excel 等,例如:
$ cat tst.awk
BEGIN { FS="[ :]"; OFS="," }
{ sum[$6,$2+0]+=$7; msgs[$6] }
END {
printf "hr"
for (msg in msgs) {
printf "%s%s", OFS, msg
}
print ""
for (hr=0; hr<=4; hr++) {
printf "%02d", hr
for (msg in msgs) {
printf "%s%d", OFS, sum[msg,hr]
}
print ""
}
}
$ awk -f tst.awk file
hr,Message1,Message2
00,12,50
01,13,10
02,0,0
03,0,0
04,0,0
$ awk -f tst.awk file | column -s, -t
hr Message1 Message2
00 12 50
01 13 10
02 0 0
03 0 0
04 0 0