我有一个JSON文件
{
"fieldA": {"fieldData": "XYZ"}
"fieldB": {"fieldData": "PQR"}
"fieldC": {"fieldData": null}
"fieldD": {"fieldData": "DEF"}
我用了jq
jq -r 'to_entries[] | if .value.fieldData != null then .key, .value.fieldData else empty end'
打印这样的数据
fieldA
XYZ
fieldB
PQR
fieldD
DEF
现在我也想用这个获得索引,但是忽略了null值。
1
fieldA
XYZ
2
fieldB
PQR
# see the 3rd field is ignored completely and 3 is given for the 4th field.
3
fieldD
DEF
发布于 2023-02-10 02:22:12
假设输入的JSON文档是有效的,如下所示:
{
"fieldA": { "fieldData": "XYZ" },
"fieldB": { "fieldData": "PQR" },
"fieldC": { "fieldData": null },
"fieldD": { "fieldData": "DEF" }
}
然后,您可以通过删除具有fieldData
值(即null
)的部分来启动您的D3
表达式:
jq 'map_values(select(.fieldData != null))' file
为了访问结果对象中每个键的索引,我们可以使用to_entries
两次,并与我们感兴趣的其他数据一起提取它:
$ jq -r 'map_values(select(.fieldData != null)) | to_entries | to_entries | map(.key+1, .value.key, .value.value.fieldData)[]' file
1
fieldA
XYZ
2
fieldB
PQR
3
fieldD
DEF
我们使用to_entries
两次访问原始对象中的键索引。
注意,JSON对象中的键顺序不一定是固定的。如果您需要在JSON结构中对事物进行固定的排序,则使用数组代替。也许就像
[
{ "name": "fieldA", "fieldData": "XYZ" },
{ "name": "fieldB", "fieldData": "PQR" },
{ "name": "fieldC", "fieldData": null },
{ "name": "fieldD", "fieldData": "DEF" }
]
使用您以前相关问题(使用检查从数组中获取json的键和值)的原始数据:
jq -r 'map(select(.name != "null")) | to_entries | map(.key+1, .value.name, .value.type)[]' file
或
jq -r 'map(select(.name != "null") | [.name, .type]) | to_entries | map(.key+1, .value[])[]' file
这与我对你另一个问题的回答有点接近。
请注意,与上面的内容相比,缺少对to_entries
的初始调用,因为我们现在没有键中的数据,因此没有对键本身的调查。
https://unix.stackexchange.com/questions/735030
复制相似问题