Json

使用帶參數的 JQ 將多個 json 文件合併為一個對象

  • January 5, 2021

我有數以千計的 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 ] )'

引用自:https://unix.stackexchange.com/questions/588063