How to concat multiple fields to same line with jq
Solution 1
Use @tsv
to generated tab-separated values as output:
jq -r '[.user, .cmd] | @tsv' <yourfile
...emits, given your input file:
alex echo '123'
john echo '456'
alex echo '789'
...though if you're filtering for only your user account, you can just print cmd
directly, since the user value is known:
jq -r 'select(.user == "alex") | .cmd'
Solution 2
When you write .user .cmd
you are asking for the "cmd" field of the JSON object at .user
. To obtain both the .user and .cmd values, you could use the "," operator:
.user, .cmd
The above, however, will produce two lines. There are many options for emitting multiple values on a single line. You might wish to consider using string interpolation; or wrapping the values in square brackets and then using one of @csv
, @tsv
, or join/1
; or using the -j command-line option.
This is all pretty clearly explained in the standard jq documentation (see e.g. https://stackoverflow.com/tags/jq/info), as is the use of select
for making a selection.
Alexander Mills
Dev, Devops, soccer coach. https://www.github.com/oresoftware
Updated on June 20, 2022Comments
-
Alexander Mills almost 2 years
If I run:
cat <file> | jq
I get:
{ "user": "alex", "num": "486", "time": "Thu Jun 6 16:26:06 PDT 2019", "pwd": "/Users/alex/codes/ores/prompt-command", "pid": 11047, "exit_code": 0, "cmd": "echo '123'" } { "user": "john", "num": "487", "time": "Thu Jun 6 16:26:24 PDT 2019", "pwd": "/Users/alex/codes/ores/prompt-command", "pid": 11108, "exit_code": 5, "cmd": "echo '456'" } { "user": "alex", "num": "488", "time": "Thu Jun 6 16:26:59 PDT 2019", "pwd": "/Users/alex/codes/ores/prompt-command", "pid": 11141, "exit_code": 5, "cmd": "echo '789'" }
but instead of all those fields, I just want some output like:
alex echo '123' alex echo '789'
so I tried this:
cat <file> | jq -r '.user .cmd'
but that didn't work I got this error:
jq: error (at :63): Cannot index string with string "cmd"
I also want to filter it so I only see my commands, something like:
cat <file> | jq -r '.user=alex .cmd'