jq를 사용하여 잘못된 JSON을 구문 분석하시겠습니까?

jq를 사용하여 잘못된 JSON을 구문 분석하시겠습니까?

jq가 잘못된 JSON을 구문 분석할 수 있나요? :

[2023.06.07-21.58.47] StatManagerLog: {
    "RoundState":
    {
        "State": "Starting",
        "Timestamp": "2023.06.07-21.58.47"
    }
}
[2023.06.07-21.58.47] StatManagerLog: {
    "RoundState":
    {
        "State": "StandBy",
        "Timestamp": "2023.06.07-21.58.47"
    }
}

이상적으로는 각 StatManagerLog 객체가 jq에 의해 읽혀집니다.

jq가 이를 어떻게 수행하는지 알 수 없는 것 같습니다. 을 사용해 보았지만 -Rjq에서 명령을 실행하는 기능이 손실되었습니다. 이것이 가능합니까, 아니면 유효한 JSON으로 만들기 위해 먼저 파일을 전처리해야 합니까?

답변1

나는 그것에 대해 특별히 익숙하지는 않지만 jq이 답변이 도움이 되기를 바랍니다.

고정된 구문에 따라 파일을 구문 분석하는 파서 작성은 종종 복잡하고 고통스러운 작업입니다.

오류를 수정하는 파서를 작성하는 것은 완전히 다른 수준입니다. 얼마나 복잡한지 상상조차 할 수 없습니다!

표시되는 입력을 "수정"할 수 있는 다양한 방법에 대해 생각해 보세요.

어쩌면 이는 and [2023.06.07-21.58.47]대신에 , 즉 6개 항목의 배열을 의미할 수도 있습니다 . 그러면 나머지는 어떻게 해야 할까요?,.-[2023,06,07,21,58,47]

어쩌면 모든 것을 [2023.06.07-21.58.47] StatManagerLog:버려야할까요? 그러면 파일은 단일 JSON이 아니라 jq이를 처리할 수 있는 것으로 보이는 여러 개의 연결된 JSON 파일입니다.

어쩌면 이것이 의미하는 바 "[2023.06.07-21.58.47] StatManagerLog":는 키 주위의 큰따옴표가 누락되고 { }전체 파일을 캡슐화하는 큰 외부 쌍이 누락되었다는 것입니다.

나는 다른 가능성이 있다고 확신하며 이 크기 정도를 수정하면 파일을 유효한 JSON으로 만들 수 있습니다. 파서는 어느 것을 선택할지 모릅니다.

이는 음성 언어와 유사합니다. 전체 문장을 명확하게 듣지 못한 적이 몇 번인지 생각해보고 뇌가 듣지 못한 부분을 자동으로 교정할 수 없기 때문에 다시 물어보십시오. 아마도 문장을 교정하는 방법을 두 가지 이상 상상할 수 있기 때문일 것입니다. 결과의 의미.

간단히 말해서, 데이터를 수정해야 하는 방법과 원래 의도가 무엇인지 아는 사람은 파서가 이를 알아낼 기회가 없습니다. 입력하기 전에 일부 텍스트 처리 도구( sed, 등) awk를 사용하여 cut수정하세요 jq. 또는 이 데이터를 내보내는 사람이 올바른 JSON을 내보내도록 수정하세요.

답변2

[{a로 시작하는 모든 줄을 유효한 JSON으로 바꾸거나 적어도 jq처리할 수 있는 유효한 JSON을 연결 하여 파일을 전처리합니다 .

$ sed 's/^\[.*/{/' file | jq -c .
{"RoundState":{"State":"Starting","Timestamp":"2023.06.07-21.58.47"}}
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}

삭제된 정보에는 이미 출력에 포함된 데이터(타임스탬프)와 정적 문자열()이 포함되어 있으므로 삭제된 정보가 필요하지 않다고 가정합니다 StatManagerLog.

그런 다음 상태 또는 타임스탬프 등 원하는 항목을 선택할 수 있습니다.

$ sed 's/^\[.*/{/' file | jq -c --arg q 2023.06.07-21.58.47 'select(.RoundState.Timestamp == $q)'
{"RoundState":{"State":"Starting","Timestamp":"2023.06.07-21.58.47"}}
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}
$ sed 's/^\[.*/{/' file | jq -c --arg q StandBy 'select(.RoundState.State == $q)'
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}

...또는 필요한 집계를 더욱 복잡하게 선택하여 수행할 수도 있습니다.

관련 정보