输入json:
[
{
"login": "u1",
"name": "u1",
"role": "User",
"groups": [
{
"id": "1234",
"name": "G1"
},
{
"id": "1235",
"name": "G2"
}
],
"created": "2020-05-11 11:06"
},
{
"login": "u2",
"name": "u2",
"role": "User",
"groups": null,
"created": "2020-05-11 11:06"
}
]
我使用以下过滤器来获取他们所属的用户和组:
$ jq -r '
.[]
| [.login,
.name,
( if .groups == null
then "grp:-"
else (del(.groups[]
| select(.name=="All Users"))
| [.groups[].name] | join("|"))
end )]
| @tsv' json
u1 u1 G1|G2
u2 u2 grp:-
如何为每个找到的组添加 grp:
前缀?
预期输出为:
u1 u1 grp:G1|grp:G2
u2 u2 grp:-
最佳答案
使用+
连接字符串:
jq -r '.[]
| [.login,.name,(
if .groups == null
then "grp:-"
else (
del(.groups[] | select(.name=="All Users"))
| ["grp:" + .groups[].name]
# ~~~~~~~~
| join("|")
)
end
)]
| @tsv'
您甚至可以避免指定“grp:”两次,但您也需要从 then 分支返回一个数组:
jq -r '.[]
| [.login, .name, (
(
if .groups == null
then ["-"]
else (
del(.groups[] | select(.name=="All Users"))
| [.groups[].name]
)
end
)
| map("grp:" + .)
| join("|")
)]
| @tsv'
更新: 从峰值中获取灵感我想这会产生您想要的输出:
jq -r '.[]
| .groups //= []
| del(.groups[] | select(.name=="All Users"))
| .groups[0] //= {name: "-"}
| [.login, .name, ( ["grp:" + (.groups[].name)] | join("|") ) ]
| @tsv'
关于arrays - jq - 为数组上的值添加前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65833864/