从jq输出元素创建新的json字符串
我的jq命令返回括号中的对象,但不带逗号分隔符。但是我想从中创建一个新的json字符串 此调用查找从jq输出元素创建新的json字符串,json,jq,Json,Jq,我的jq命令返回括号中的对象,但不带逗号分隔符。但是我想从中创建一个新的json字符串 此调用查找arr中包含FooItem的所有元素,然后从索引3处的嵌套数组返回text: jq '.arr[] | select(index("FooItem")) | .[3].texts' 在这个json上(原始的有更多的元素): 返回此输出: [ "aBarfoo", "avalue" ] [ "mybarfoo", "bValue" ] 但我想从这些对象创建一个新的json,如下所
arr
中包含FooItem
的所有元素,然后从索引3
处的嵌套数组返回text
:
jq '.arr[] | select(index("FooItem")) | .[3].texts'
在这个json上(原始的有更多的元素):
返回此输出:
[
"aBarfoo",
"avalue"
]
[
"mybarfoo",
"bValue"
]
但我想从这些对象创建一个新的json,如下所示:
{
"arr": [
[
"aBarfoo",
"avalue"
],
[
"mybarfoo",
"bValue"
]
]
}
jq能做到这一点吗
编辑
还有一个补充:考虑到文本也有长度为零的字符串,您将如何删除这些字符串/在结果中不删除它们
"texts": ["",
"mybarfoo",
"bValue",
""
]
通过对流进行修饰(即,在本例中,通过如下方式包装流),始终可以将(零个或多个)JSON实体的流嵌入到其他JSON结构中:
{ arr: [ STREAM ] }
但是,在本例中,我们也可以认为我们只是在编辑原始文档,并相应地使用map(select(…)
idiom:
.arr |= map( select(index("FooItem")) | .[3].texts)
后一种方法确保保留“arr”键的上下文
补遗
要过滤掉空字符串,只需添加另一个映射(选择(…)
:
非常感谢。它起作用了!不过,我肯定要绞尽脑汁才能理解它。有没有办法在输出中重命名数组
arr
。使用第一种方法,只需指定替代名称。例如,使用第二种方法,您可以编写:.newname=(.arr | map(…))| del(.arr)
Thank you@peak。我还有最后一个补充,但不想在评论中问这个问题,所以我对这个问题进行了编辑。也许你可以再帮我一次。谢谢你的补充!!
.arr |= map( select(index("FooItem")) | .[3].texts)
.arr |= map( select(index("FooItem"))
| .[3].texts | map(select(length>0)))