JSON 파일의 임의 위치에서 특정 요소의 값을 구문 분석합니다.

JSON 파일의 임의 위치에서 특정 요소의 값을 구문 분석합니다.

"sid"for VALUE1(= ) 789069이후의 값을 일치시키고 싶습니다.
문제는 행의 순서가 무작위라는 것입니다.

[{"cid":"PWER","data":[{"VALUE1":0}],"sid":"789069","units":"kWm","age":586667},
{"cid":"PWER","data":[{"VALUE2":809}],"sid":"788325","units":"kWm","age":11},
{"cid":"PWER_SUB","data":[{"VALUE3":278}],"sid":"789540","units":null,"age":1},
{"cid":"PWER_SUB","data":[{"VALUE4":319}],"sid":"789093","units":null,"age":38},
{"cid":"PWER_SUB","data":[{"VALUE5":0}],"sid":"789069","units":null,"age":4}

그것을 일치시키는 방법에 대한 아이디어가 있습니까?

답변1

누락된 내용이 ]마지막에 삽입되었다고 가정하면 이는 JSON 문서이므로 JSON 구문 분석기를 사용하여 구문 분석해야 합니다.jq.

사용jq:

$ jq -r '.[] | select(.data[0].VALUE1) | .sid' data.json
789069

이렇게 하면 JSON 개체 배열을 가져오고 배열 항목 VALUE1의 첫 번째 요소에서 호출된 키가 있는 개체를 선택합니다 data. 그런 다음 sid해당 개체에서 항목 값을 추출합니다.

"원시 출력" -r에 대한 옵션입니다 . jq이것이 없으면 큰따옴표로 묶인 값을 받게 됩니다.

답변2

Grep은 이와 같은 문제를 해결하는 데 훌륭한 도구입니다 grep -oP '"sid":"\d+"' file . 이것이 당신이 원하는 것입니까?

고쳐 쓰다: 그렇지 않아요! ! ! (죄송합니다: 원래 질문을 이해하지 못했습니다.)

두 번째 버전: 다음과 같은 json 도구를 사용합니다 json.

cat a.json | json -c '"VALUE1" in this.data[0]' | json -a sid

또는

cat a.json | json -c '"VALUE1" in this.data[0]' -a sid 
  • json -c predicate - 필터 엘리먼트(필터)
  • json -a expression - 모든 요소(맵)에 표현식 적용

설명서는 다음 위치에 있습니다.http://trentm.com/json/. 설치되지 않은 경우:

install node
and sudo npm install -g json

답변3

전체 레코드를 일치시키 려면 awk다음을 사용할 수 있습니다.

awk '{if($0~/789069/){print $0}}' file

이 코드에서는 awk행에 값이 포함되어 있는지 확인한 789069다음 있는 그대로 인쇄하고 다른 행은 무시합니다.

산출:

[{"cid":"PWER","data":[{"VALUE1":0}],"sid":"789069","units":"kWm","age":586667},
{"cid":"PWER_SUB","data":[{"VALUE5":0}],"sid":"789069","units":null,"age":4}

관련 정보