对每个 jq 输出进行编号

对每个 jq 输出进行编号

我有一个 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

现在我也想用它来获取索引,但忽略空值。

1
fieldA
XYZ
2
fieldB
PQR
# see the 3rd field is ignored completely and 3 is given for the 4th field.
3
fieldD
DEF

答案1

假设您的输入 JSON 文档有效,如下所示:

{
   "fieldA": { "fieldData": "XYZ" },
   "fieldB": { "fieldData": "PQR" },
   "fieldC": { "fieldData": null },
   "fieldD": { "fieldData": "DEF" }
}

然后,您可以通过删除值为 的jq部分来开始表达式:fieldDatanull

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因为我们现在没有键中的数据因此无需调查密钥本身。

相关内容