% jq -c '[path(.tags[]|select(contains(["tag:primary"])))[-1]]' hosts.json
["ams01","zrh02"]
2m28s from time I downloaded hosts.json to producing this solution, though I must admit I had to take a moment to look up contains to realized it had to take an array—I could've used index/1 and had a better time. % jq -c '[.hosts[]|select(.tags|index("tag:primary")).name]' hosts_advanced.json
["ams01","zrh02"]
This one was much quicker, just 1m5s, but of course after I'd already done the previous one.It's a language. You can learn it, and then it can be easier to write programs in it. Or you can blame the tool, sure.
edit: and for the curious, this is the path I took to produce these programs:
wget https://gist.github.com/ruuda/31cffffaa595492a335a4637503f4b7a/raw/7ae5bef0ac331eb2fb7d67cac6cc867e13a675f3/hosts.json
jq . hosts.json
jq .tags hosts.json
jq '.tags|path(.[]|select(contains("tag:primary")))' hosts.json
jq '.tags|path(.[]|select(contains(["tag:primary"])))' hosts.json
jq '.tags|path(.[]|select(contains(["tag:primary"])))[-1]' hosts.json
jq 'path(.tags[]|select(contains(["tag:primary"])))[-1]' hosts.json
jq '[path(.tags[]|select(contains(["tag:primary"])))[-1]]' hosts.json
jq -c '[path(.tags[]|select(contains(["tag:primary"])))[-1]]' hosts.json
jq -c '[path(.tags[]|select(index("tag:primary")|debug))[-1]]' hosts.json
jq -c '[path(.tags[]|select(index("tag:primary")))[-1]]' hosts.json
wget https://gist.github.com/ruuda/31cffffaa595492a335a4637503f4b7a/raw/7ae5bef0ac331eb2fb7d67cac6cc867e13a675f3/hosts_advanced.json
jq . hosts_advanced.json
jq '.hosts' hosts_advanced.json
jq '.hosts[]' hosts_advanced.json
jq '.hosts[]|select(.tags|index("tag:primary"))' hosts_advanced.json
jq '[.hosts[]|select(.tags|index("tag:primary")).name]' hosts_advanced.json
jq -c '[.hosts[]|select(.tags|index("tag:primary")).name]' hosts_advanced.jsonI'll echo the value of ijq, https://sr.ht/~gpanders/ijq/ The live updating makes for less to remember and visualize. Though there is some value in having intermediate history recorded, for the second and later questions you ask of the data. (And supports commenting out for error diagnosis without deleting half the expression, `# ...`, hash and space required.)
I hadn't known of `debug`, quite convenient. I've often used multiple outputs at the tail, for example `... | keys, .` to remind myself of the structure as I explore down. Also `gron` and `fzf --multi`.
.tags | to_entries | map(select(.value[] == "tag:primary") | .key))
This took me a little while as I wasn’t at a computer so I couldn’t build the query interactively.I think the big advantage jq has is that ChatGPT can generate filters from English descriptions.
And you can then create queries to select certain keys - highly useful if you're dealing with monster documents, and customise the output of that (eg to reduce into just the info you need). Plus probably much more, but those are the features I've used so far. Big thanks to the Devs!
I use it for the performance because there is a big startup time for `jq`, with `jaq` I can use it in scripts that are called every seconds in my status bar without delay.
Just one tiny personal regret. I get GPT-4 to write almost all of my jq scripts for me, and it's going to stay stuck on that 2021 version for an unknown time going forward.
I guess I could try and come up with some custom instructions that teach it about the new syntax!
jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)
wouldn't a more jq-y syntax be: | {a, b.c, x}
(which fails on the 'b.c' term)114 points by drewda 62 days ago | past | 27 comments
https://news.ycombinator.com/item?id=36951830
* jq 1.7
434 points by wwader 25 days ago | past | 206 comments
jq is awesome and thanks to the new team for their recent efforts and energy, it massively appreciated.