我会写
> echo '{"a": "arbiter", "b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'
"arbiter"
"brisk"
"astound"
"bistro"但如果我做了
> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a, .b, .c'我得到了
"arbiter"
"brisk"
[
"cloak",
"conceal"
]
"astound"
"bistro"
[
"confer",
"consider"
]如何将c数组扁平化以代替
"arbiter"
"brisk"
"cloak",
"conceal"
"astound"
"bistro"
"confer",
"consider"<#>更新
由于零安全性在几种现代语言中相当流行(这是有道理的),所以不妨假设上面提出的问题是不完整的。有必要知道如何处理缺少值的问题。
如果其中一个值是null,
> echo '{"b": "brisk"}{"a": "astound", "b": "bistro"}' | jq '.a, .b'我们在输出中得到一个null
null
"brisk"
"astound"
"bistro"这很可能是我们想要的。我们可以增加第二步(小心不要排除"null"),但如果jq本身排除了nulls,那就更干净了。只写select(.a != null)就行了,但引入了{}级别。从nulls内部抛弃S的正确方法是什么?
发布于 2021-06-12 21:57:56
jq表达式
[.a, .b, .c]从输入对象中提取我们想要的所有元素,并将它们放在数组中。其中一些元素可能是数组,因此我们需要将所有元素都扁平化:
[.a, .b, .c] | flatten对于输入对象
{
"a": "arbiter",
"b": "brisk",
"c": [
"cloak",
"conceal"
]
}这将生成数组。
[
"arbiter",
"brisk",
"cloak",
"conceal"
]然后,您将得到一个类似但独立于第二个对象的数组。
要将这两个数组合并为一个,我们可以简单地通过.[]传递数据,但是编写flatten | .[]的一种快捷方法是flatten[]。利用这个,我们到达
[.a, .b, .c] | flatten[]摘要:
echo '...as in the question...' |
jq '[.a, .b, .c] | flatten[]'如果您还想清除任何null值,通过select(. != null)进行筛选,或者使用[.a//empty,.b//empty,.c//emtpy]提取值,或者在flatten[]之前通过map(.//empty)进行筛选。
作为注释:您的输入JSON是使用问题中的一个简单的echo创建的。但是,要在命令行上正确地创建JSON,请考虑使用像jo这样的工具,该工具还将适当地编码数据,以便包含在JSON文档中:
可以使用两个jo调用创建第二个示例JSON
jo a=arbiter b=brisk 'c[]'=cloak 'c[]'=conceal
jo a=astound b=bistro 'c[]'=confer 'c[]'=consider发布于 2021-06-12 19:04:24
好吧,那是相当微不足道的。不需要Python的讨人喜欢的JSON库,甚至不需要使用awk或sed的泛泛性来降低这个库的水平。这就足以写:
> echo '{"a": "arbiter", "b": "brisk", "c": ["cloak", "conceal"]} {"a": "astound", "b": "bistro", "c": ["confer", "consider"]}' | jq '.a, .b, .c[]'我们得到:
"arbiter"
"brisk"
"cloak"
"conceal"
"astound"
"bistro"
"confer"
"consider"https://unix.stackexchange.com/questions/654014
复制相似问题