我有一个日志文件,其中包含用户选择某个 ID 的事件,我想对其进行解析以创建摘要。
对于每个事件,该文件在以关键字 开头的单行中包含用户可用的 ID 列表Available
,最后在以关键字 开头的行中包含用户最终选择的 ID Chosen
。下面是一个例子
Available for user:75=1654 at Time=5504.09
Chosen by user:75=1655
Available for user:10=1300 at Time=550.09
Available for user:10=1301 at Time=550.09
Available for user:10=1303 at Time=550.09
Chosen by user:10=1301
在示例中,我们看到用户75
已选择 ID,尽管当时1655
仅1654
显示该 ID 。Available
在不同的时间,我们看到用户10
有 ID options 1300
、1301
to 1303
choice from 和 selected 1301
。
请注意,每个用户可能会记录多个此类事件;某些用户可能会记录数百个此类选择事件。
问题是:我们如何计算这些事件的发生次数并根据日志文件打印摘要。我想为每个用户打印一份摘要,显示该用户选择可用 ID 的频率,以及他选择可用 ID 的频率。不是可用的。
理想情况下,输出看起来像
User 1 chose 103 ids from list and 23 not from list
User 2 chose 31 ids from list and 6 not from list
...
我已经尝试过,grep
但无法每次都存储可用 ID 列表并与所选 ID 进行比较。但任何带有grep
、awk
或 的解决方案sed
都是受欢迎的。
答案1
这可能就是您正在寻找的内容,没有预期的输出,这是一个猜测,但希望您可以进行按摩以适应:
$ cat tst.awk
BEGIN { FS="[:= ]" }
$1 == "Chosen" {
if ( $5 in avail ) {
availCnt++
str = ""
}
else {
notAvailCnt++
str = " not"
}
userCnt++
printf "User %s chose %s which was%s available\n", $4, $5, str
delete avail
next
}
NF { avail[$5] }
END {
printf "%d users chose available %d times and not available %d times\n", userCnt, availCnt, notAvailCnt
}
。
$ awk -f tst.awk file
User 75 chose 1655 which was not available
User 10 chose 1301 which was available
2 users chose available 1 times and not available 1 times
上面的代码可以在每个 UNIX 机器上的任何 shell 中使用任何 awk 来工作。
答案2
试试这个 sed 脚本:
/^Avail/{
s/[^=]*=([^ ]*).*/\1/;H
}
/^Chosen/{
s/.*=//;G;h;x;y/\n/,/
s/,/ is ab in /;s/$/,/
/(.*) is.*,\1,/s/ab/pre/
s/(ab|pre) in ,(.*),/\1sent in \2/
p;s/.*//;x
}
输出:自定义格式(OP未指定)
sesh@pc:~/unix$ sed -nrf script.sed input.txt
1655 is absent in 1654
1301 is present in 1300,1301,1303
在 sed 中计数是非常困难的。例如,您可以通过管道来grep -c absent
对用户选择的 ID 不存在于可用 ID 中的所有事件进行计数。