"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}