jq - 为数组中的值添加前缀
jq - add preffix to values on array
输入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:”两次,但您也需要 return 来自 then 分支的数组:
jq -r '.[]
| [.login, .name, (
(
if .groups == null
then ["-"]
else (
del(.groups[] | select(.name=="All Users"))
| [.groups[].name]
)
end
)
| map("grp:" + .)
| join("|")
)]
| @tsv'
更新:
从 peak 获得灵感我想这会产生你想要的输出:
jq -r '.[]
| .groups //= []
| del(.groups[] | select(.name=="All Users"))
| .groups[0] //= {name: "-"}
| [.login, .name, ( ["grp:" + (.groups[].name)] | join("|") ) ]
| @tsv'
这是已经给出的解决方案的一个稍微更短且可能更整洁的变体。它具有处理本页其他地方的评论中提到的边缘情况的优势。
.[]
| .groups //= [{name: "-"}]
| [.login,
.name,
(del(.groups[] | select(.name=="All Users"))
| ["grp:" + (.groups[].name)] | join("|"))
]
| @tsv
更简单
.groups //= [{name: "-"}]
| .groups |= map(select( .name != "All Users") )
| [.login, .name,
(.groups | map("grp:" + .name) | join("|")) ]
| @tsv```
输入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:”两次,但您也需要 return 来自 then 分支的数组:
jq -r '.[]
| [.login, .name, (
(
if .groups == null
then ["-"]
else (
del(.groups[] | select(.name=="All Users"))
| [.groups[].name]
)
end
)
| map("grp:" + .)
| join("|")
)]
| @tsv'
更新: 从 peak 获得灵感我想这会产生你想要的输出:
jq -r '.[]
| .groups //= []
| del(.groups[] | select(.name=="All Users"))
| .groups[0] //= {name: "-"}
| [.login, .name, ( ["grp:" + (.groups[].name)] | join("|") ) ]
| @tsv'
这是已经给出的解决方案的一个稍微更短且可能更整洁的变体。它具有处理本页其他地方的评论中提到的边缘情况的优势。
.[]
| .groups //= [{name: "-"}]
| [.login,
.name,
(del(.groups[] | select(.name=="All Users"))
| ["grp:" + (.groups[].name)] | join("|"))
]
| @tsv
更简单
.groups //= [{name: "-"}]
| .groups |= map(select( .name != "All Users") )
| [.login, .name,
(.groups | map("grp:" + .name) | join("|")) ]
| @tsv```