利用可能なリストをシェルスクリプトで選択したIDと比較する

利用可能なリストをシェルスクリプトで選択したIDと比較する

ユーザーが特定のIDを選択するイベントを含むログファイルがあり、それを解析して要約を作成したいと思います。

各イベントのファイルには、キーワードで始まる行にユーザーが使用できるIDのリストが含まれ、最後にキーワードで始まる行にユーザーが最後に選択したAvailableIDが含まれています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

例では、ユーザーが75IDを選択したことがわかりますが、その時点でそのIDのみが1655表示されます。他の場合は、ユーザーにIDオプション、選択可能、および選択があることがわかります。1654Available101300130113031301

各ユーザーはこれらのイベントを複数記録でき、一部のユーザーは何百もの選択イベントを記録できます。

問題は次のとおりです。これらのイベントの発生回数をどのように計算し、ログファイルに基づいて要約を印刷できますか?各ユーザーが利用可能な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システムのすべてのシェルで動作します。

おすすめ記事