使用格式返回JQ中的多个块



我有以下json作为输入:

[
{
"ENVIRONMENT": [
"sit"
], 
"Usage": [], 
"id": "i-098a99bd2bd0ac86b", 
"Name": [
"instance1"
]
}, 
{
"ENVIRONMENT": [
"uat"
], 
"Usage": [
"testing"
], 
"id": "i-0b210876db6d028f3", 
"Name": [
"instance2"
]
}
]

我可以使用jq '.[] | [.id, .ENVIRONMENT[], .Usage[], .Name[]]'来获得以下内容:

[
"i-098a99bd2bd0ac86b",
"sit",
"instance1"
]
[
"i-0b210876db6d028f3",
"uat",
"testing",
"instance2"
]

或者我可以使用jq '.[] | {id: .id, env: .ENVIRONMENT[], usage: .Usage[], name: .Name[]}'来获得以下内容(它只返回其中一个实例(:

{
"id": "i-0b210876db6d028f3",
"env": "uat",
"usage": "testing",
"name": "instance2"
}

有没有一种方法可以获得第二个方法的格式,但像第一个方法一样返回所有实例?我想,对于其中一个实例中不存在的标记,用法将为空或null。

你可以试试这个jq过滤器:

jq '.[]|{id,env:.ENVIRONMENT[],usage:(.Usage[]//null),name:.Name[]}' file

这几乎与您相同,除了.Usage[]//null给出Usage,或者如果不存在null

请注意,您的第一次尝试与相同

jq '.[]|flatten' 

(需要jq 1.5(

通常,在使用时必须小心。[]多次采用OP的方式。如果你只想要每个数组中的第一个项目,那么你可以使用.[0]如下:

.[]
| {id, env: .ENVIRONMENT[0], usage: .Usage[0], name: .Name[0]}

(这种方法很好地处理了一些数组为空的情况。(

如果(例如(.ENVIRONMENT数组可能有多个项目,您可能需要考虑另一个变体,例如:

.[]
| range(0; .ENVIRONMENT|length) as $i
| {id, env: .ENVIRONMENT[$i], usage: .Usage[$i], name: .Name[$i]}

最新更新