我试图找出是否可以单独使用
awk
传入 一个日志文件,然后让awk
输出一个带有的不同消息 小时(00-23)的细分以及该特定的计数 小时与不同的消息。
Message1
00 13
01 30
...
23 6
Message2
00 50
01 10
...
23 120
etc, etc
输入文件看起来有点如下:
blah,blah
2016-06-24 00:30:54 blah Message1 7 rand rand2
2016-06-24 00:40:12 blah Message2 35 rand rand2
2016-06-24 00:42:15 blah Message2 12 rand rand2
2016-06-24 00:58:01 blah Message1 5 rand rand2
2016-06-24 00:58:12 blah Message2 3 rand rand2
2016-06-24 01:02:25 blah Message2 2 rand rand2
2016-06-24 01:02:30 blah Message1 3 rand rand2
2016-06-24 01:05:14 blah Message1 10 rand rand2
2016-06-24 01:30:56 blah Message2 5 rand rand2
2016-06-24 01:55:41 blah Message2 3 rand rand2
blah, blah
请注意,这是一个弥补的输入文件。
要获取此输入文件所请求的输出,我知道我需要print $4
然后在新行上执行print substr($2,1,2)" "sum[$5]
之类的操作。对于相同的$4
小时,我必须将$4
添加到一起。
另请注意,我必须使用awk
3.1.7,所以我不能做任何奇特的新内容awk
4.1.0 +。
我知道如何获取不同的消息。
{
msg[$4]++
}
END {
for (m in msg) {
print m;
}
}
要回到小时,我可以按照以下方式做点什么:
{
msg[$4]++
hr[$4] = substr($2,1,2)
}
END {
for (m in msg) {
print m;
print hr[m];
}
}
最后,对于总和来说,这将是:
{
msg[$4]++
hr[$4] = substr($2,1,2)
sum[$4] += $5
}
END {
for (m in msg) {
print m;
print hr[m]" "sum[m];
}
}
非常感谢任何和所有帮助。
答案 0 :(得分:2)
你想要的东西是:
$ 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
但显然它有点猜测,因为它与您发布的示例输入相对,但您没有提供相关的预期输出。
btw问题主题行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
更改&#34; 4&#34;至&#34; 23&#34;明显。我还建议您考虑使用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