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.