사용 가능한 목록을 쉘 스크립트에서 선택한 ID와 비교

사용 가능한 목록을 쉘 스크립트에서 선택한 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

예제에서는 사용자가 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 시스템의 모든 쉘에서 작동합니다.

답변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를 선택한 경우 모든 이벤트를 계산하기 위해 파이프를 사용할 수 있습니다.

관련 정보