簡體   English   中英

jq合並沒有重復的json數組

[英]jq merge json arrays without duplicates

我正在努力用jq合並兩個JSON數組,因為我想刪除合並對象中的重復鍵:

編輯 :由於該示例過於簡單,因此添加了第二個鍵。

file1.json:

[
  {"a": 1, "value": 11},
  {"b": 2},
  {"c": 3}
]

file2.json:

[
  {"a": 4, "value": 44},
  {"b": 5},
  {"d": 6}
]

預期結果:

[
  {"a": 4, "value": 44},
  {"b": 5},
  {"c": 3},
  {"d": 6}
]

jq add file1.json file2.json復制了鍵(我在數組中有兩個鍵為“ a”的對象)。

我從網上嘗試了許多答案,但是每個人都有自己的用例,沒有一個直接起作用。 最接近的是這個: JQ-合並兩個數組,但是我無法使其與文件(而不是字符串參數)一起使用。

我最后的嘗試是

jq \
  --slurpfile base file1.json \
  --slurpfile params file2.json \
  '$base + $params | unique_by(.Key)'

jq解決方案:

jq --slurpfile file2 file2.json \
'. + $file2[] | map(to_entries) | flatten 
 | group_by(.key) | map(.[-1] | {(.key): .value})' file1.json

輸出:

[
  {
    "a": 4
  },
  {
    "b": 5
  },
  {
    "c": 3
  },
  {
    "d": 6
  }
]

[此答案經過編輯以反映Q中的變化。]

下面的解決方案使用INDEX/2限定如https://github.com/stedolan/jq/blob/master/src/builtin.jq使用的一個優點INDEX是,它避免使用group_by ,這需要排序的成本,在任何情況下都可能不希望這樣做。

如果您的jq版本沒有INDEX/2 ,則其定義如下:

def INDEX(stream; idx_expr):
  reduce stream as $row ({};
    .[$row|idx_expr|
      if type != "string" then tojson
      else .
      end] |= $row);

此過濾器( INDEX/2 )構造一個字典,其鍵等於應用於流元素的idx_expr的不同值,以使與特定鍵關聯的值是流中映射到該值的最后一項。

[INDEX( add[] | to_entries; (.[0] | .key) )[]
 | from_entries ]

調用:

jq -scf program.jq file1.json file2.json

輸出:

[{"a":4,"value":44},{"b":5},{"c":3},{"d":6}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM