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 -r
jot -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
}
]
}