使用 jq 转换特定字段
Transform a particular field with jq
我有一个 json 对象,它的字段可以是字符串或数组值。
{
"roles": ["ADMIN", "USER"]
"user_id": 100,
"message": "abc added a user xyz",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
{
"roles": "ADMIN"
"user_id": 102,
"message": "a added a user b",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
我想将角色字段转换为 csv,并保持其余字段不变。
{
"roles": "ADMIN,USER"
"user_id": 100,
"message": "abc added a user xyz",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
{
"roles": "ADMIN"
"user_id": 102,
"message": "a added a user b",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
我尝试阅读文档,但找不到仅转换单个字段的结构。可以用Jq实现吗?
一种选择是使用过滤器:
.roles |= if type == "array" then join(",") else . end
在第一个示例中,这将产生值:"ADMIN,USER"
一个更强大的过滤器是:
.roles |= if type == "array" then map(tostring)|join(",") else . end
更可靠的方法是在 then
子句中使用 @csv
,但这会产生比您想要的更多的引号:
"\"ADMIN\",\"USER\""
所以您可能要考虑改用@tsv;它会产生:
"ADMIN\tUSER"
我有一个 json 对象,它的字段可以是字符串或数组值。
{
"roles": ["ADMIN", "USER"]
"user_id": 100,
"message": "abc added a user xyz",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
{
"roles": "ADMIN"
"user_id": 102,
"message": "a added a user b",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
我想将角色字段转换为 csv,并保持其余字段不变。
{
"roles": "ADMIN,USER"
"user_id": 100,
"message": "abc added a user xyz",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
{
"roles": "ADMIN"
"user_id": 102,
"message": "a added a user b",
"level": "info",
"created_at": "2014-10-12 14:06:37"
}
我尝试阅读文档,但找不到仅转换单个字段的结构。可以用Jq实现吗?
一种选择是使用过滤器:
.roles |= if type == "array" then join(",") else . end
在第一个示例中,这将产生值:"ADMIN,USER"
一个更强大的过滤器是:
.roles |= if type == "array" then map(tostring)|join(",") else . end
更可靠的方法是在 then
子句中使用 @csv
,但这会产生比您想要的更多的引号:
"\"ADMIN\",\"USER\""
所以您可能要考虑改用@tsv;它会产生:
"ADMIN\tUSER"