
配列には、次の内容を含むファイルがあります。FAVORITE_FULL
私のBashスクリプトではこれをこう呼んでいます。
[
{
"name": "__SOLOPIANO__ by rautemusik (rm.fm)",
"url_resolved":"https://rautemusik-de-hz-fal-stream14.radiohost.de/solopiano?ref=radiobrowser&listenerid=31363235323832333936-326130333a343030303a33373a34323a633466653a346366663a666561373a38393431-3533343132-53747265616d436865636b426f742f302e312e30",
"favicon": "https://i.ibb.co/48KRX7M/solopiano.jpg",
"tags": "ambient,jazz,smooth lounge,smooth,smooth jazz",
"countrycode": "DE",
"language": "english,deutsch german,deutsch,german"
},
{
"name": "- 0 N - Smooth Jazz",
"url_resolved":"http://0n-jazz.radionetz.de/0n-jazz.aac",
"favicon": "http://www.0nradio.com/images/favicon/mstile-144x144.png",
"tags": "ambient,jazz,smooth lounge,smooth,smooth jazz",
"countrycode": "DE",
"language": "german"
},
...
]
このプロセスでは、ファイルにJSONを生成します。私はTEMP_FILE2
それを私のスクリプトで呼び出します。
{
"name": ".977 Smooth Jazz",
"url_resolved":"http://19353.live.streamtheworld.com:3690/977_SMOOJAZZ_SC",
"favicon": "http://977music.com/images/logo.gif",
"tags": "jazz,smooth jazz",
"countrycode": "US",
"language": "english"
}
これで、以下に基づいて試しましたTEMP_FILE2
。FAVORITE_FULL
このスレッド。
1.
jq '.[] += ["$TEMP_FILE2"]' "$FAVORITE_FULL" "$TEMP_FILE2"
これにより、次のエラーが返されます。
jq: error (at /Users/shinichiokada/.tera/favorite.json:33): object ({"name":"__...) and array (["$TEMP_FIL...) cannot be added
jq: error (at /tmp/tera_favorite2.json:1): Cannot iterate over null (null)
jq --argjson TEMP "$(cat "$TEMP_FILE2")" '.[] += [$TEMP]' "$FAVORITE_FULL"
これにより、次のエラーが返されます。
jq: error (at /Users/shinichiokada/.tera/favorite.json:33): object ({"name":"__...) and array ([{"changeuu...) cannot be added
あるファイルのJSONを別のファイルの配列に追加するには?
答え1
jq '. += [input]' "$FAVORITE_FULL" "$TEMP_FILE2"
その後、[input]
配列に+=
。この関数はinput
次の入力ファイルを読み込みます。ここではこれを使って配列の$TEMP_FILE2
内容を読み込みます。$FAVORITE_FULL
+=
または、
jq '[ .[], input ]' "$FAVORITE_FULL" "$TEMP_FILE2"
これにより、最初のファイルの配列が展開され、次に2番目のファイルのオブジェクトが最後の要素である新しい配列が作成されます。
--slurp
または、以下を使用することもできます-s
。
jq -s '.[0] += [.[1]] | .[0]' "$FAVORITE_FULL" "$TEMP_FILE2"
.[0]
これにより、最初のファイルの配列がに追加され、オブジェクトがに追加され、すべての入力ファイルが配列に読み込まれます.[1]
。次に、新しいオブジェクトの配列を作成し、[.[1]]
それを配列に追加します。最後に更新された配列を出力します.[0]
。
上記の代替ソリューションと同じバリエーション:
jq -s '[ .[0][], .[1] ]' "$FAVORITE_FULL" "$TEMP_FILE2"
--argjson
また、あなたの試みにはわずかな調整しか必要でないことがわかりました。
jq --argjson t "$(cat "$TEMP_FILE2")" '. += [$t]' "$FAVORITE_FULL"
(オブジェクトセット、拡張配列)の.
代わりに(配列)を参照してください。.[]
または以下を使用してください--slurpfile
。
jq --slurpfile t "$TEMP_FILE2" '. += $t' "$FAVORITE_FULL"
$t
ここではなく注意してください[$t]
。フルルックモードを使用する場合、$t
最後の例では、単一オブジェクトを含む配列と同様に、常にデータに配置されます。$TEMP_FILE2