사용자가 특정 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 시스템의 모든 쉘에서 작동합니다.
답변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를 선택한 경우 모든 이벤트를 계산하기 위해 파이프를 사용할 수 있습니다.