将可用列表与 shell 脚本中选定的 id 进行比较

将可用列表与 shell 脚本中选定的 id 进行比较

我有一个日志文件,其中包含用户选择某个 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,尽管当时16551654显示该 ID 。Available在不同的时间,我们看到用户10有 ID options 13001301to 1303choice 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 进行比较。但任何带有grepawk或 的解决方案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 中的所有事件进行计数。

相关内容