我想让JQ在一行上打印出数组。我的输入是一个我想要规范化的Avro架构。这主要是为了在我们改进模式时以一种有助于简化Git差异的方式规范化输出。我能够使用这样的过滤器来控制字段的顺序,但是如何强制将数组强制为单行。输出的格式似乎受JQ的控制。
jq '{name: .name, fields: .fields | map({ name: .name, type: .type})}' my.json
我希望能够显示:
{
"name": "rm",
"fields": [
{
"name": "stat_1",
"type": "long"
},
{
"name": "stat_2",
"type": [
"long",
"null"
]
}
]
}
像这样:
{
"name": "rm",
"fields": [
{
"name": "stat_1",
"type": "long"
},
{
"name": "stat_2",
"type": ["long", "null"] << FLATTENED
}
]
}
答案 0 :(得分:0)
由于你的目的是让比较更简单,这就是我的建议,即使它不是你想要的:
walk(if type == "array" and all(.[]|type; . != "array" and . != "object")
then tostring else . end)
这具有展平标量数组所需的效果,但它通过将它们转换为字符串来实现:
{
"fields": [
{
"name": "stat_1",
"type": "long"
},
{
"name": "stat_2",
"type": "[\"long\",\"null\"]"
}
],
"name": "rm"
}
如果你的jq有isempty
(或者如果你不介意添加它的定义,例如你的〜/ .jq),上面的内容可以简化为:
walk(if type == "array" and isempty(.[]|iterables) then tostring else . end)
如果您的jq没有isempty
,则其定义如下:
def isempty(g): 0 == ((label $go | g | (1, break $go)) // 0);