다음 줄에서 사용 가능한 목록 인쇄 수를 비교하세요.

다음 줄에서 사용 가능한 목록 인쇄 수를 비교하세요.

패턴 사이의 숫자(id)를 추출할 수 있습니다(사용자가 사용할 수 있는 것:그리고사용자가 선택함:) 특정 사용자가 ID 목록에 있는 ID 중 하나를 선택하면 일치합니다.

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

내 질문에 답하기 위해 sed 모드를 사용했습니다.사용 가능한 목록을 쉘 스크립트에서 선택한 ID와 비교

사용되는 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
}

이제 "Selected by user:" 줄 뒤에 글로벌 ID와 로컬 ID가 추가된 파일이 생겼습니다.

Available for user:75=1654 at Time=5504.09 
Chosen by user:75=1655
globalID=1000 localID=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
globalID=1020 localID=1301 

Available for user:20=1400 at Time=550.09
Available for user:20=1501 at Time=550.09
Available for user:20=1503 at Time=550.09
Chosen by user:20=1503
globalID=1030 localID=1503

이제 두 개의 별도 파일 file1과 file2에서 모든 일치 및 불일치에 대해 모든 줄의 globalID를 인쇄하고 싶습니다. 사용 가능한 목록에서 특정 사용자가 선택한 ID의 globalID가 다음과 같이 저장되는 file1(대소문자 일치)의 출력:

1020
1030

특정 사용자가 사용 가능한 목록에서 선택하지 않은 ID의 globalID가 다음과 같이 저장되는 file2(불일치 사례)의 출력:

1000

나는 노력했다

sed -nrf script.sed input.txt  | grep absent -A1 > file2

그리고

sed -nrf script.sed input.txt | grep present -A1 > file1

그러나 소스 파일의 다음 줄은 제공되지 않지만 sed 스크립트 출력의 다음 줄은 제공됩니다.

답변1

내가 게시 한 awk 답변을 취하면이전 질문"select" 줄에 도달할 때가 아니라 빈 줄이나 파일 끝에 도달했을 때 정보를 인쇄하도록 조정합니다(이 작업을 먼저 수행해야 했지만 게으릅니다).

$ cat tst.awk
BEGIN { FS="[:= ]" }
NF {
    if ( $1 == "Chosen" ) {
        user = $4
        chosen = $5
    }
    else {
        avail[$5]
    }
    next
}
{ prt() }
END {
    prt()
    printf "%d users chose available %d times and not available %d times\n", userCnt, availCnt, notAvailCnt
}

function prt() {
    if ( chosen in avail ) {
        availCnt++
        str = ""
    }
    else {
        notAvailCnt++
        str = " not"
    }
    userCnt++
    printf "User %s chose %s which was%s available\n", user, chosen, str
    delete avail
}

그런 다음 새 입력에 대해 실행하면 다음이 생성됩니다.

$ awk -f tst.awk file
User 75 chose 1655 which was not available
User 10 chose 1301 which was available
User 20 chose 1503 which was available
3 users chose available 2 times and not available 1 times

그런 다음 이를 조정하여 globalID를 인쇄할 수 있습니다.

$ cat tst2.awk
BEGIN { FS="[:= ]" }
NF {
    if ( $1 == "Chosen" ) {
        user = $4
        chosen = $5
    }
    else if ( $1 == "globalID" ) {
        globalID = $2
    }
    else {
        avail[$5]
    }
    next
}
{ prt() }
END {
    prt()
    printf "%d users chose available %d times and not available %d times\n", userCnt, availCnt, notAvailCnt
}

function prt() {
    if ( chosen in avail ) {
        availCnt++
        str = ""
    }
    else {
        notAvailCnt++
        str = " not"
    }
    userCnt++
    printf "User %s chose %s which was%s available, and had globalID %s\n", user, chosen, str, globalID
    delete avail
}

출력:

$ awk -f tst2.awk file
User 75 chose 1655 which was not available, and had globalID 1000
User 10 chose 1301 which was available, and had globalID 1020
User 20 chose 1503 which was available, and had globalID 1030
3 users chose available 2 times and not available 1 times

실제로 출력하려는 ​​내용을 인쇄하기 위해 명령문을 변경하는 것이 얼마나 쉬운지 확인하시기 바랍니다. print(그리고 grep이나 다른 것으로 파이프하지 말고 awk에서 수행하면 쉽습니다.) 예를 들어:

$ cat tst3.awk
BEGIN { FS="[:= ]" }
NF {
    if ( $1 == "Chosen" ) {
        user = $4
        chosen = $5
    }
    else if ( $1 == "globalID" ) {
        globalID = $2
    }
    else {
        avail[$5]
    }
    next
}
{ prt() }
END { prt() }

function prt() {
    if ( chosen in avail ) {
        result = "match"
    }
    else {
        result = "nomatch"
    }
    if ( target == result ) {
        print globalID
    }
    delete avail
}

.

$ awk -v target='match' -f tst3.awk file
1020
1030

$ awk -v target='nomatch' -f tst3.awk file
1000

관련 정보