Json
使用帶參數的 JQ 將多個 json 文件合併為一個對象
我有數以千計的 JSON 文件要合併到一個對像中。這些都不是類似的格式。讓我詳細解釋一下。這是 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 個文件具有第一個範例格式和一個文件具有第二個範例格式。我正在嘗試使用它
jq
來合併它。jq -s '.' *.json > myfile.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 } ], [ { "value 3": 300, "value 4": 400, "value 5": 500, "value 6": 600 } ]
我需要將其合併到一個對像中,如下所示,如果有任何
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 } ]
您可以使用
inputs
對所有 JSON 文件的內容一起應用過濾器並應用選擇過濾器。該-n
標誌是為了確保輸出 JSON 是從給定輸入從頭開始構造的。jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json
通過這樣做
jq -n 'inputs[]'
,所有組成 JSON 文件中的所有對像都可用於 select 函式,該函式將任何包含 key 欄位的對象丟棄為"value 6"
. 過濾器[..]
周圍的最終結果對像被放入數組中。另一種方法是使用
reduce()
函式以迭代方式添加所需的對象jq -n 'reduce inputs[] as $data (.; . + [ if $data | has("value 6") | not then $data else empty end ] )'