키-값 로그 파일에서 테이블 형식의 파일 만들기

키-값 로그 파일에서 테이블 형식의 파일 만들기

다음과 같은 로그 파일이 있습니다.

27/12/2020 00:05:30,848 ===== Request ======
code = 0
trigger1 = false
trigger2 = false
field = {
     1|status=0
     2|tag=abcdef
     3|price=35
     ...
}
===== Response =====
code = 1
trigger1 = false
trigger2 = false
field = {
     5|id=123
     1|status=404
     2|tag=ghijkl
     4|barcode=26121111
     3|price=35
     ...
}
27/12/2020 00:10:35,941 ===== Request ======
code = 0
trigger1 = false
trigger2 = false
field = {
     1|status=0
     2|tag=abcdef
     3|price=35
     ...
}
===== Response =====
code = 1
trigger1 = false
trigger2 = false
field = {
     5|id=123
     1|status=404
     2|tag=ghijkl
     4|barcode=26121111
     3|price=35
     ...
}

...덜 유용한 영역을 모두 나타냅니다 . 다음과 같은 테이블을 만들고 싶습니다(또는 csv 파일도 괜찮습니다).

Time                     id   status tag    price barcode
27/12/2020 00:05:30,848  Null 0      abcdef 35    Null
27/12/2020 00:05:30,848  123  404    ghijkl 35    26121111
27/12/2020 00:10:35,941  Null 0      abcdef 35    Null
27/12/2020 00:10:35,941  123  404    ghijkl 35    26121111

나는 사용했다이 솔루션하지만 잘 작동하지 않습니다. :( 출력 수는 동일하지만 ID와 바코드는 없기 때문에 지금은 일시적으로 grep상태, 라벨 및 가격을 단일 파일에 추가하는 데 사용하고 있습니다. 내 코드는 paste비트는 다음과 같습니다:

grep "1|status=" file > status
grep "2|tag=" file > tag
grep "3|price=" file > price
paste status tag price > output

내 출력 파일은 다음과 같습니다

1|status=0   2|tag=abcdef  3|price=35
1|status=404 2|tag=ghijkl  3|price=35
1|status=0   2|tag=abcdef  3|price=35
1|status=404 2|tag=ghijkl  3|price=35

field = { * }각각을 grep 하여 null을 반환하지 않으면 모든 키 값이 있는지 확인하고 싶습니다 . 나는 bash 스크립팅을 처음 접했기 때문에 내 해결 방법이 최적화되었는지 잘 모르겠습니다. 당신의 도움이 필요해요. 감사합니다! ! !

답변1

$ cat tst.awk
BEGIN {
    OFS = "\t"
    numTags = split("Time id status tag price barcode",tags)
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tag = tags[tagNr]
        printf "%s%s", tag, (tagNr<numTags ? OFS : ORS)
    }
}
/= Request =/ {
    time = substr($0,1,23)
}
sub(/^[[:space:]]*([0-9]+\|)?/,"") {
    tag = val = $0
    sub(/[[:space:]]*=.*/,"",tag)
    sub(/[^=]+=[[:space:]]*/,"",val)
    tag2val[tag] = val
}
/^}/ {
    tag2val["Time"] = time
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tag = tags[tagNr]
        val = (tag in tag2val ? tag2val[tag] : "Null")
        printf "%s%s", val, (tagNr<numTags ? OFS : ORS)
    }
    delete tag2val
}

$ awk -f tst.awk file | column -s$'\t' -t
Time                     id    status  tag     price  barcode
27/12/2020 00:05:30,848  Null  0       abcdef  35     Null
27/12/2020 00:05:30,848  123   404     ghijkl  35     26121111
27/12/2020 00:10:35,941  Null  0       abcdef  35     Null
27/12/2020 00:10:35,941  123   404     ghijkl  35     26121111

관련 정보