json 목록에 키 이름을 추가하려면 jq를 작성하세요.

json 목록에 키 이름을 추가하려면 jq를 작성하세요.

Linux에서 json 파일을 대체하고 새 파일에 쓰는 쿼리를 작성하려고 합니다.

내 json 파일의 형식은 다음과 같습니다.

{"intents": [
  {
    "patterns": "'For the last 8 years of his life, Galileo was under house arrest for espousing this man's theory'",
    "responses": "Copernicus"
  },
  {
    "patterns": "'No. 2: 1912 Olympian; football star at Carlisle Indian School; 6 MLB seasons with the Reds, Giants & Braves'",
    "responses": "Jim Thorpe"
  },

위와 같은 항목이 약 200,000개입니다.

내가 실행한 명령은 다음과 같습니다.

jq --argjson r \
  "$( jo tag = "$(curl -Ss "https://www.random.org/integers/?num=1&min=0&max=1000000&col=1&base=10&format=plain&rnd=new")")" \
  '.intents[] += $r' \
< intents7.json > intents_super.json

새로 추가하고 싶어요키 이름목록에 다음과 같이상표이름과 키를 입력하고 싶습니다(상표)각각에 대해난수. 명령이 실행되었지만 지금까지 Intents_super.json 파일에 출력이 없는 상태로 30분을 기다렸습니다.

노트:CPU도 터미널에서 100%로 유지됩니다. 다음 두 줄이 표시되지만 명령은 여전히 ​​실행 중입니다...:

Argument `tag' is neither k=v nor k@v
Argument `17208' is neither k=v nor k@v

이 명령이 내가 원하는 대로 작동하나요?

답변1

임의의 숫자를 값으로 사용하여 최상위 배열의 각 요소 tag에 새 키를 추가하고 싶다면 다음을 수행할 수 있습니다.intents

some-command | jq -n 'input | .intents |= map(.tag = input)' intents7.json -

... 한 줄에 하나씩(예: 또는 유사) some-command무한한 난수 스트림을 생성하는 명령은 어디에 있습니까 ?shuf -i 0-100 -rjot -r 0

이 명령은 입력의 일반적인 읽기를 끄는 jq옵션과 함께 사용됩니다 . -n대신 input다음 개체를 가져오는 데 사용됩니다.

첫 번째 객체는 파일에서 읽혀지고 수정하려는 배열을 intents7.json포함합니다 . intents우리는 배열의 각 요소를 수정하는 데 사용합니다 map(). map각 요소에 추가하는 표현식은 키를 추가 하고 tagread 값을 사용합니다 input. 각 호출 input(첫 번째 호출 이후)은 표준 입력 스트림에서 읽습니다 jq. 이 스트림에는 tag새 키 값 에 사용되는 nonce가 있습니다 .

예제 실행(질문에 있는 데이터의 수정된 변형 사용):

$ shuf -i 0-1000 -r | jq -n 'input | .intents |= map(.tag = input)' intents7.json -
{
  "intents": [
    {
      "patterns": "'For the last 8 years of his life, Galileo was under house arrest for espousing this man's theory'",
      "responses": "Copernicus",
      "tag": 517
    },
    {
      "patterns": "'No. 2: 1912 Olympian; football star at Carlisle Indian School; 6 MLB seasons with the Reds, Giants & Braves'",
      "responses": "Jim Thorpe",
      "tag": 955
    }
  ]
}

답변2

나는 다른 방법으로 문제를 해결했습니다.

od -t x -An /dev/random | tr -d " " | fold -w 8 | jq -nRc --slurpfile stream intents7.json '$stream[] .intents[] | .tag=input' > intensfinalllllll.json

관련 정보