jqファイルのオブジェクトをファイルの配列に追加する方法

jqファイルのオブジェクトをファイルの配列に追加する方法

配列には、次の内容を含むファイルがあります。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_FILE2FAVORITE_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

おすすめ記事