パラメータ付きJQを使用して複数のjsonファイルを1つのオブジェクトに結合する

パラメータ付きJQを使用して複数のjsonファイルを1つのオブジェクトに結合する

何千ものJSONファイルがあり、それを1つのオブジェクトにマージしたいと思います。同様の形式ではありません。詳しく説明します。 JSONの最初の例です。

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  }
]

他のタイプと似ていません。以下のように、公開フィールドやその他のフィールドはほとんどありません。

[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]

たとえば、最初のサンプル形式の2つのファイルと2番目のサンプル形式の1つのファイルがあります。jqマージしようとしています。

jq -s '.' *.json > myfile.json

3 つの異なるオブジェクトを使用して、次を返します。

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  }
],
[
  {
    "value 1": 10,
    "value 2": 20,
    "value 3": 30,
    "value 4": 40
  }
],
[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]

以下のように1つのオブジェクトにマージする必要があり、jq特定のフィールドを持つそのファイルを除外するオプションはありますか?たとえば、このフィールドを含むファイルを除外します"value 6"。したがって、最終的なJSON出力は次のようになります。

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  },
  {
    "value 1": 10,
    "value 2": 20,
    "value 3": 30,
    "value 4": 40
  }
]

ベストアンサー1

inputsすべてのJSONファイルのコンテンツにフィルタを適用し、選択フィルタを一緒に適用できます。この-nフラグは、指定された入力に基づいて出力JSONが最初から作成されたことを確認するために使用されます。

jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json

これにより、jq -n 'inputs[]'JSONファイルを構成するすべてのオブジェクトをselect関数に使用できます。これは、キーフィールドを含むすべてのオブジェクトを削除します"value 6"[..]フィルタの周囲には、配列の最終結果オブジェクトが配置されます。

reduce()別の方法は、関数を使用して必要なオブジェクトを繰り返し追加することです。

jq -n 'reduce inputs[] as $data (.; . + [ if $data | has("value 6") | not then $data else empty end ] )'

おすすめ記事