programing

jq: 중첩된 개체, 최상위 ID를 추출하고 내부 개체에서 값을 들어 올립니다.

javaba 2023. 3. 6. 23:02
반응형

jq: 중첩된 개체, 최상위 ID를 추출하고 내부 개체에서 값을 들어 올립니다.

이하에 기재되어 있는 경우xample.json;

[
 {
  "id": 12345678,
  "stuff": { "book": "shelf", "hook": "line", "took": "off", "info-spec": 12 },
  "votes": 23
 },
 {
  "id": 12345679,
  "stuff": { "book": "maker", "hook": "sinker", "took": "pisin", "info-spec": 23 },
  "votes": 1
 }
]

추출할 수 있습니다.id그리고.votes간단하게:

$ jq '.[] | { id, votes }' xample.json
{
  "votes": 23,
  "id": 12345678
}
{
  "votes": 1,
  "id": 12345679
}

하지만 이 쿼리는 어떻게 생겼을까요?id그리고.stuff.info-spec? (나에게) 명백한 구문은 전혀 기능하지 않습니다.

$ jq '.[] | { id, stuff.info-spec }' xample.json
error: syntax error, unexpected '.', expecting '}'
.[] | { id, stuff.info-spec }
                 ^
1 compile error

나는 노력했다.stuff[info-spec]그리고.stuff["info-spec"]하지만 어떻게 해야 할지 모르겠어요

키네임의 대시로 인해 더 복잡해지는 것 같습니다만, 이중 따옴표로 대응할 수 있는 것은 한정되어 있습니다.

$ sed 's/votes/vo-tes/g' xample.json | jq '.[] | { id, "vo-tes" }'

는 예상 출력을 제공합니다(즉, "vo-tes"의 대시 없이 위와 유사).

추출할 수 있다book:

$ jq '.[] | .stuff.book' xample.json

그러나 다시 한 번 의 구문을 알아낼 수 없습니다.id그리고.book하지만 추출할 수 없습니다.info-spec같은 구문을 사용합니다.

$ jq '.[] | .stuff."info-spec"' xample.json
error: syntax error, unexpected QQSTRING_START, expecting IDENT
.[] | .stuff."info-spec"
             ^
1 compile error

따옴표를 빼면 오류 메시지가 (예측대로) 다릅니다.

$ jq '.[] | .stuff.info-spec' xample.json
error: spec is not defined
.[] | .stuff.info-spec
                  ^^^^
1 compile error

하지만 이건 효과가 있어

$ jq '.[] | .stuff["info-spec"] ' xample.json
12
23

이 예에서 원하는 출력은 다음과 같습니다.

{
  "info-spec": 12,
  "id": 12345678
}
{
  "info-spec": 23,
  "id": 12345679
}

FAQCookbook을 살펴봤는데 다른 오브젝트 안에 있는 오브젝트 안에서 아이템을 들어올리기 위한 구문은 찾을 수 없는 것 같습니다.

흥미로운 것은, 이 문제는 확실히 「-」자이기 때문에, 다음과 같습니다.

jq '.[] | { id, "info-spec": .stuff."info-spec" }' xample.json
{
  "id": 12345678,
  "info-spec": 12
}
{
  "id": 12345679,
  "info-spec": 23
}

아직 너의jq이 구문은 다음 부분에서 끊어져서 마음에 들지 않는 것 같습니다.

jq '.[] | .stuff."info-spec"' xample.json
12
23

사용방법:

jq --version
jq-1.4

edit: <1.4> 버전의 문제인 것 같습니다.https://github.com/stedolan/jq/issues/38

겨우 알아냈어요.

$ jq '.[] | { id, "info-spec": .stuff["info-spec"] }' xample.json
{
  "info-spec": 12,
  "id": 12345678
}
{
  "info-spec": 23,
  "id": 12345679
}

여기서의 열쇠는, 이 머신을newkey: .complex["key"]리프팅 표기법.

언급URL : https://stackoverflow.com/questions/27562424/jq-nested-object-extract-top-level-id-and-lift-a-value-from-internal-object

반응형