ScottS
ScottS

Reputation: 8543

How to pass a key to a jq file

I would like to write a simple jq file that allows me to count items grouped by a specified key.

I expect the script contents to be something similar too:

group_by($group) | map({group: $group, cnt: length})

and to invoke it something like

cat my.json | jq --from-file count_by.jq --args group .header.messageType

Whatever I've tried the argument always ends up as a string and is not usable as a key.

Upvotes: 0

Views: 457

Answers (1)

peak
peak

Reputation: 116640

Since you have not followed the minimal complete verifiable example guidelines, it's a bit difficult to know what the best approach to your problem will be, but whatever approach you take, it is important to bear in mind that --arg always passes in a JSON string. It cannot be used to pass in a jq program fragment unless the fragment is a JSON string.

So let's consider one option: passing in a JSON object representing a path that you can use in your program.

So the invocation could be:

jq -f count_by.jq --argjson group '["header", "messageType"]'

and the program would begin with:

group_by(getpath($group)) | ...

Having your cake ...

If you really want to pass in arguments such as .header.messageType, there is a way: convert the string $group into a jq path:

($group|split(".")|map(select(length>0))) as $path

So your jq filter would look like this:

($group|split(".")|map(select(length>0))) as $path
| group_by(getpath($path)) | map({group: $group, cnt: length})

Shell string interpolation

If you want a quick bash solution that comes with many caveats:

group=".header.messageType"
jq 'group_by('"$group"') | map({group: "'"$group"'", cnt: length}'

Upvotes: 1

Related Questions