我有一个文件,数组中包含以下内容。我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"
这将从第一个文件扩展数组,然后从中创建一个新数组,并将第二个文件中的对象作为最后一个元素。
您还可以使用--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]
这里。当我们使用 slurp 模式时,被 slurp 的数据总是放入一个数组中,最后一个示例中$t
包含单个对象的数组也是如此。$TEMP_FILE2