1

我试过使用

jq "reduce inputs.skins as $s (.; .skins += $s)" file1.json file2.json > combined.json

但它只是从每个文件中创建两个 boots.name 和 fun.name

任何方式我都可以使用 jq 并组合对象和数组而不会重复?

对于任何混淆,我深表歉意,jq 很难找到一个简单的教程让我理解

文件1.json

{
  "skins": [
    {
      "Item Shortname": "boots.name",
      "skins": [
        2,
        25,
        41,
      ]
    },
    {
      "Item Shortname": "fun.name",
      "skins": [
        12,
        8,
      ]
    }
   ]
}

文件2.json

{
  "skins": [
    {
      "Item Shortname": "boots.name",
      "skins": [
        2,
        20,

      ]
    },
    {
      "Item Shortname": "fun.name",
      "skins": [
        90,
        6,
        82,
      ]
    }
   ]
}

组合.json

{
  "skins": [
    {
      "Item Shortname": "boots.name",
      "skins": [
        2,
        20,
        25,
        41,
      ]
    },
    {
      "Item Shortname": "fun.name",
      "skins": [
        90,
        6,
        82,
        12,
        8,
      ]
    }
   ]
}
4

1 回答 1

0

这里棘手的部分是满足明显的唯一性要求,可以使用以下通用过滤器:

# emit a stream of the distinct items in `stream`
def uniques(stream):
 foreach stream as $s ({};
   ($s|type) as $t
   | (if $t == "string" then $s else ($s|tostring) end) as $y
   | if .[$t][$y] then .emit = false else .emit = true | (.item = $s) | (.[$t][$y] = true) end;
   if .emit then .item else empty end );

这样可以确保保留顺序。这有点棘手,因为它是完全通用的——它允许1"1"区分它们,就像这样unique做一样。

(如果顺序无关紧要,那么您可以使用unique。)

因此,假设沿线调用

jq -s -f program.jq file1.json file2.json

您可以在 program.jq 中放置上面的 def 后跟以下“主”程序:

  .[0] as $file1 | .[1] as $file2
  | (INDEX($file1.skins[]; .["Item Shortname"]) | map_values(.skins)) as $dict

  | $file2
  | .skins |= map( .["Item Shortname"] as $name
                   | .skins += $dict[$name]
                   | .skins |= [uniques(.[])] )

更好的解决方案是避免使用 -s 选项(例如,如下所示),但上述将两个文件提供给 jq 的方法至少很简单,并且无论您使用的是哪个版本的 jq 都可以使用。

解决方案使用input

避免混淆这两个文件的一种方法是input与 -n 命令行选项而不是 -s 结合使用。jq 程序的“主要”部分将如下所示:

(INDEX(input.skins[]; .["Item Shortname"]) | map_values(.skins)) as $dict
| input
| .skins |= map( .["Item Shortname"] as $name
                 | .skins += $dict[$name]
                 | .skins |= [uniques(.[])] )
于 2021-05-16T13:42:45.890 回答