Skip to content

Latest commit

 

History

History
52 lines (43 loc) · 1.72 KB

zip-two-json-files-together-based-on-shared-id.md

File metadata and controls

52 lines (43 loc) · 1.72 KB

Zip Two JSON Files Together Based On Shared ID

Let's say we have JSON file (list1.json) that contains an array of objects. Maybe they represent metadata about some books. Something like this:

[
  { 'slug': 'the-subtle-knife', 'title': 'The Subtle Knife', ... },
  { 'slug': 'all-systems-red', 'title': 'All Systems Red', ... },
  { 'slug': 'piranesi-abc123', 'title': 'Piranesi', ... },
  ...
]

And then we have another JSON file (list2.json) in a similar format that contains an additional piece of metadata tied to each slug:

[
  { 'slug': 'the-subtle-knife', 'author': 'Philip Pullman' },
  { 'slug': 'all-systems-red', 'author': 'Martha Wells' },
  { 'slug': 'piranesi-abc123', 'author': 'Susanna Clarke' },
  ...
]

And we want to pull the details from the second file and combine them into the first file based on that shared identifier, in this case, the slug.

Instead of copying over a ton of values manually or writing a full-fledged script to do this, we can use a jq one-liner with the --slurpfile flag.

jq --slurpfile list1 list1.json --slurpfile list2 list2.json -n '
  $list1[] as $item1
  | $list2[] as $item2
  | select($item1.slug == $item2.slug)
  | $item1 + $item2
'

[
  { 'slug': 'the-subtle-knife', 'title': 'The Subtle Knife', 'author': 'Philip Pullman', ... },
  { 'slug': 'all-systems-red', 'title': 'All Systems Red', 'author': 'Martha Wells', ... },
  { 'slug': 'piranesi-abc123', 'title': 'Piranesi', 'author': 'Susanna Clarke', ... },
  ...
]

This reads in both files as lists into named variables, selects for the items that have matching slug values, and then unions those objects together. The result will go to standard out, but it could also be redirected into a new JSON file.