我的jq命令返回括号中的对象,但不带逗号分隔符。但是我想从中创建一个新的json字符串。
此调用查找其中包含arr
的{{1}}的所有元素,然后从嵌套数组的索引FooItem
返回texts
:
3
在此json上(原始元素包含更多元素):
jq '.arr[] | select(index("FooItem")) | .[3].texts'
返回此输出:
{
"arr": [
[
"create",
"w199",
"FooItem",
{
"index": 0,
"texts": [
"aBarfoo",
"avalue"
]
}
],
[
"create",
"w200",
"NoItem",
{
"index": 1,
"val": 5,
"hearts": 5
}
],
[
"create",
"w200",
"FooItem",
{
"index": 1,
"texts": [
"mybarfoo",
"bValue"
]
}
]
]
}
但是我想从这些看起来像这样的对象中创建一个新的json:
[
"aBarfoo",
"avalue"
]
[
"mybarfoo",
"bValue"
]
jq可以这样做吗?
编辑
又一个补充:考虑到文本也有长度为零的字符串,您如何删除那些/不将它们包含在结果中?
{
"arr": [
[
"aBarfoo",
"avalue"
],
[
"mybarfoo",
"bValue"
]
]
}
答案 0 :(得分:2)
您始终可以通过装饰流(即在当前情况下,如下所示包装STREAM),将(零个或多个)JSON实体流嵌入到其他JSON结构中:
{ arr: [ STREAM ] }
但是,在当前情况下,我们还可以认为我们只是在编辑原始文档,因此使用了map(select(...))
惯用语的变体:
.arr |= map( select(index("FooItem")) | .[3].texts)
后一种方法可确保保留“ arr”键的上下文。
要过滤出空字符串,只需添加另一个map(select(...))
:
.arr |= map( select(index("FooItem"))
| .[3].texts | map(select(length>0)))