JSON:提取并打印值匹配模式的键和值对

JSON:提取并打印值匹配模式的键和值对

JSON:

"{
  "a": "https://is2-ssl.com/",
  "b": "https://a5.-ssl.com/",
  "type": "response",
  "c": [
    {
      "Number": 1,
      "Reportname": "XXX",
      "size": "2.5",
      "Variants": [
        "YYY"
      ]
    }
  ],
"Meta": "ABC"
}

所需输出:

XXX,a,https://is2-ssl.com/
XXX,b,https://a5.-ssl.com/

我想打印那些值包含“http”(url) 的键值对,并将键和值与分隔符“,”合并,并向其中添加 ReportName

答案1

"假设JSON 文档中的首字母是拼写错误,您希望.ReportName第一的数组中的条目c,并且您希望输出为 CSV:

$ jq -r '.c[0].Reportname as $n | map_values(select(type == "string" and startswith("http"))) | to_entries[] | [$n, .key, .value] | @csv' file
"XXX","a","https://is2-ssl.com/"
"XXX","b","https://a5.-ssl.com/"

表达方式jq

.c[0].Reportname as $n |
map_values(select(type == "string" and startswith("http"))) |
to_entries[] | [$n, .key, .value] | @csv

首先挑选出.Reportname值并将其分配给内部jq变量$n。然后,它通过丢弃与以 substring 开头的字符串不关联的任何键来重写原始对象http

示例文档缩减map_values()

{
  "a": "https://is2-ssl.com/",
  "b": "https://a5.-ssl.com/"
}

然后将其转换to_entries为等价的

[
   { "key": "a", "value": "https://is2-ssl.com/" },
   { "key": "b", "value": "https://a5.-ssl.com/" }
]

...自行访问密钥。

该数组扩展为一组对象,[]并且保存的值与集合中每个对象的一部分一起用于创建一个数组,该数组将转换为带$n引号的 CSV 输出。.key.value@csv


另一个jq具有相同输出的表达式,但执行得更to_entries早一些,然后map()对创建的数组执行操作,而不是像map_values()上面那样对对象的值执行操作。

.c[0].Reportname as $n | 
to_entries | 
map(
   select(.value | type == "string" and startswith("http")) |
   [$n, .key, .value] | @csv
)[]

相关内容