何千もの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 ] )'