我想列出 JSON 结构中的几个字段,包括一个可选字段,该字段可能与我不想显示的其他字段一起位于数组中。我一直在使用 select() 从我想要的数组中获取一个值,但是如果我有一个没有该可选键的对象,那么它会被一起跳过。让我举个例子。这是数据:
[
{"field1":"1", "field2":"x", "Tags":[{"Key": "Name", "Value": "Name1"}, {"Key": "tag1", "Value": "tag1valuea"}]},
{"field1":"2", "field2":"y", "Tags":[{"Key": "Name", "Value": "Name2"}]},
{"field1":"3", "field2":"z", "Tags":[{"Key": "tag2", "Value": "tag2valueb"}]}
]
我想要的输出是:
1 x name1
2 y name2
3 z
我努力了:
jq -r '.[] | .field1 + " " + .field2 + " " + (.Tags[] | select(.Key == "Name") .Value)'
1 x Name1
2 y Name2
但是,正如您所看到的,它删除了第三个条目,因为它没有设置为“Name”的“Key”。
然后我尝试:
jq -r '.[] | .field1 + " " + .field2 + " " + (.Tags[] | if(.Key == "Name") then .Value else null end)'
1 x Name1
1 x
2 y Name2
3 z
您可以看到我最终得到了第一个对象的两个条目,因为它在数组中有一个我不关心的额外元素。
我已经尝试了上述两个选项的多种排列,但均无济于事。我希望有人有一种聪明的方法让 jq 不“清空”该项目(如果它没有我正在选择的键)和/或当数组中有我不想选择的项目时重复。
我想有很多方法可以做到这一点,有些可能更好,但这里有一个
jq
过滤器可以做到这一点(使用该--raw-output
选项)。输出示例:
在jqplay.org上尝试一下。
如果
"Tags"
包含多个.Key == "Name"
对象,则每个对象"Value"
都附加在同一行,例如:在jqplay.org上尝试一下。
如果
.Tags
数组包含多个匹配项怎么办?假设第一个(“1 x”)记录的数组{"Key": "Name", "Value": "AnotherName"}
中有第三个项目。.Tags
那么您会选择像 这样的组合行作为输出1 x Name1 AnotherName
,还是像1 x Name1
和 那样的两个单独的行作为输出1 x AnotherName
?无论如何,这是使用字符串插值的两种变体,并根据扩展输入显示输出,并添加了上面提到的匹配项。组合线(演示):
单独的行(演示):