ユーザーが特定の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を選択したことがわかりますが、その時点でそのIDのみが1655
表示されます。他の場合は、ユーザーにIDオプション、選択可能、および選択があることがわかります。1654
Available
10
1300
1301
1303
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
上記のコードは、awkを使用するすべてのUNIXシステムのすべてのシェルで動作します。