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
)[]