bash スクリプトを使用して JSON ファイルをマージする 質問する

bash スクリプトを使用して JSON ファイルをマージする 質問する

私は bash スクリプトの初心者です。複数の json ファイルを結合するスクリプトを書こうとしました。例:

ファイル1:

{
  "file1": {
     "foo": "bar"
  }
}

ファイル2:

{
  "file1": {
     "lorem": "ipsum"
  }
}

結合されたファイル:

{
  "file1": {
    "foo": "bar"
  },
  "file2": {
    "lorem": "ipsum"
  }
}

私が思いついたのはこれです:

awk 'BEGIN{print "{"} FNR > 1 && last_file == FILENAME {print line} FNR == 1 {line = ""} FNR==1 && FNR != NR {printf ","} FNR > 1 {line = $0} {last_file = FILENAME} END{print "}"}' json_files/* > json_files/all_merged.json

うまく動作しますが、もっと良い方法があると思います。何かアイデアはありますか?

ベストアンサー1

awkでJSONを扱うのは、あまり良い考えではありません。意味のない空白を勝手に変更すると、コードが壊れてしまいます。代わりに、jq; これはこのような目的のために作られています。 2 つのオブジェクトを結合するには、*2 つのファイルに対して演算子を使用します。

jq -s '.[0] * .[1]' file1.json file2.json

任意の数のファイルの場合は、reduceを使用してすべてに順番に適用します。

jq -s 'reduce .[] as $item ({}; . * $item)' json_files/*

この-sスイッチにより、jqJSON ファイルの内容を、処理する前に大きな配列に読み込むことができます。

おすすめ記事