json 在jq中处理多个文件

fquxozlt  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(113)

假设我有两个文件如下:
文件1:

[   
  "id1",
  "id2"
]

文件2:

[
  {
    "id": "id1",
    "name": "name1"
  },
  {
    "id": "id1",
    "name": "name2"
  },
  {
    "id": "id3",
    "name": "name3"
  },
  {
    "id": "id5",
    "name": "name5"
  },
  {
    "id": "id2",
    "name": "name6"
  }
]

我想在file2中找到那些id存在于file1中的条目,在上面的例子中,预期的输出应该是这样的:

[
  {
    "id": "id1",
    "name": "name1"
  },
  {
    "id": "id1",
    "name": "name2"
  },
  {
    "id": "id2",
    "name": "name6"
  }
]

我如何才能做到这一点与jq。

xytpbqjk

xytpbqjk1#

你会得到更好/更简洁的答案,但这似乎是工作。Slurp 两个文件到一个数组中,使用file1.json内容作为reducefile2.json的过滤器。

jq --slurp '.[0] as $filt | reduce .[1][] as $ref ([]; if IN($ref.id; $filt[]) then . + [$ref] else . end)' file1.json file2.json

jqplay.org上试试。
如果文件大小很大,这可能会更好,因为它不会发出“slurp”的声音。

jq --null-input 'input as $filt | reduce inputs[] as $ref ([]; if IN($ref.id; $filt[]) then . + [$ref] else . end)' file1.json file2.json

jqplay.org上试试这个。
两个输出:

[
  {
    "id": "id1",
    "name": "name1"
  },
  {
    "id": "id1",
    "name": "name2"
  },
  {
    "id": "id2",
    "name": "name6"
  }
]
juud5qan

juud5qan2#

由于两个输入都已经是数组,因此不需要--slurp。此外,由于只有两个输入,因此也不需要调用--null-input,只需使用input作为第二个输入。例如,以相反的顺序使用输入:

jq 'input as $ids | map(select(IN(.id; $ids[])))' file2.json file1.json
[
  {
    "id": "id1",
    "name": "name1"
  },
  {
    "id": "id1",
    "name": "name2"
  },
  {
    "id": "id2",
    "name": "name6"
  }
]

Demo

相关问题