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%に保たれます。次の2行が表示されますが、コマンドはまだ実行中です。

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 -

... 1行に1つずつ(たとえば、類似)some-command無限の乱数ストリームを生成するコマンドはどこにありますか?shuf -i 0-100 -rjot -r 0

このコマンドは、入力の一般的な読み取りをオフにするjqオプションと一緒に使用されます。-n代わりに、input次のオブジェクトを取得するために使用されます。

最初のオブジェクトにはファイルから読み込まれ、変更したい配列がintents7.json含まれています。intents配列の各要素を変更するために使用しますmap()map各要素に追加する式はキーを追加し、tag読み取り値を使用しますinput。各呼び出しinput(最初の呼び出し以降)は標準入力ストリームから読み取られますjq。このストリームには、tag新しいキー値に使用されるノンスがあります。

実行例(質問のデータの修正されたバリエーションを使用):

$ 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
    }
  ]
}

おすすめ記事