jq를 사용하여 특정 줄 앞에 json 청크 추가

jq를 사용하여 특정 줄 앞에 json 청크 추가

이미 json 파일이 있고 jq를 사용하여 파일을 열고 편집하려는 시나리오가 있습니다.

json 파일(temp.json):

{
  "a":{
    "keya" : "abc",
    "keyb" : "xyz"
  },
  "c":{
    "keyc" : "yyy"
  }
}

c여기에서는 검색을 통해 블록 앞에 다른 json 객체를 추가하고 싶습니다 . 기본적으로 마지막 객체 앞에 값을 추가합니다. 이 경우 마지막 객체는 항상c

  "b":{
    "keyb" : "yop"
  }

jq를 사용하여 insert 블록을 구현했는데 원하는 위치에 삽입되지 않았습니다. jq '. |= . + {"b":{ "keyb" : "yop" }}' temp.json

어떤 도움이라도 좋을 것입니다.

답변1

jq키를 정렬하는 데 사용할 수 있는 옵션입니다 -S. 예를 들어

$ jq -S '. |= . + {"b":{ "keyb" : "yop" }}' temp.json
{
  "a": {
    "keya": "abc",
    "keyb": "xyz"
  },
  "b": {
    "keyb": "yop"
  },
  "c": {
    "keyc": "yyy"
  }
}

답변2

객체는 정렬되지 않은 키 모음입니다. 키 순서정말 상관없어요JSON 문서를 읽는 애플리케이션에. 정렬된 데이터를 원하는 경우 배열 사용을 고려하세요.

다음은 단계별 솔루션입니다. 최종 코드는 맨 끝에 있습니다.

배열은 순서가 지정되어 있으므로 다음을 사용하여 최상위 개체를 키와 값의 순서가 지정된 배열로 변환할 수 있습니다 to_entries.

$ jq 'to_entries' file
[
  {
    "key": "a",
    "value": {
      "keya": "abc",
      "keyb": "xyz"
    }
  },
  {
    "key": "c",
    "value": {
      "keyc": "yyy"
    }
  }
]

이 배열의 마지막 요소 앞에 콘텐츠를 삽입할 수 있습니다. 여기서는 첫 번째 요소(마지막 원래 요소를 제외한 모든 요소 .[:-1]), 새 요소 및 마지막 원래 요소( ) 의 조각을 사용하여 .[-1]"항목" 배열을 덮어씁니다 .

$ jq 'to_entries | . |= .[:-1] + [ { key: "b", value: { keyb: "yop" } }, .[-1] ]' file
[
  {
    "key": "a",
    "value": {
      "keya": "abc",
      "keyb": "xyz"
    }
  },
  {
    "key": "b",
    "value": {
      "keyb": "yop"
    }
  },
  {
    "key": "c",
    "value": {
      "keyc": "yyy"
    }
  }
]

from_entries그런 다음 키 순서를 변경하지 않고 원래 형식으로 다시 변환할 수 있습니다 .

$ jq 'to_entries | . |= .[:-1] + [ { key: "b", value: { keyb: "yop" } }, .[-1] ] | from_entries' file
{
  "a": {
    "keya": "abc",
    "keyb": "xyz"
  },
  "b": {
    "keyb": "yop"
  },
  "c": {
    "keyc": "yyy"
  }
}

명령줄에서 새 요소를 키 및 JSON 개체로 전달합니다.

$ jq --arg key 'yellow' --argjson value '{ "type": "color" }' 'to_entries | . |= .[:-1] + [ { key: $key, value: $value }, .[-1] ] | from_entries' file
{
  "a": {
    "keya": "abc",
    "keyb": "xyz"
  },
  "yellow": {
    "type": "color"
  },
  "c": {
    "keyc": "yyy"
  }
}

관련 정보