我有一些看起来像这样的JSON。
{ "id": "tjh",
"records": [
{ "name": "number_of_logins",
"shortname": "nol",
"value": 3
},
{ "name": "failed_attempts",
"shortname": "fa",
"value": 4
},
{ "name": "locations",
"shortname": "loc",
"value": 5
}
]}
它是带有文件中成千上万条记录的行格式。请记住这一点,因为答案可能只适用于一条记录,而需要适用于整个文件。
我需要将其转换为
ID , name:value,name:value,name:value
ID , name:value,name:value,name:value
ID , name:value,name:value,name:value
文件中每个json条目一行。
基本上每个ID或文件中每个ID记录一行输出。
我正在努力解决以下问题。
看来我可以重新格式化以获取ID,值列表。 我也可以重新格式化以获取ID,名称列表。
当我同时添加两者时,会得到重复。
这里是在jqplay上,https://jqplay.org/s/QTk42jn-a0
例如:
这很接近:
.id , (.records[].name + ":")
返回,
"tjh"
"number_of_logins:"
"failed_attempts:"
"locations:"
这真的很接近,我只需要添加值即可。
这就是我要添加值时发生的事情:
过滤器:
.id , (.records[].name + ":" + (.records[].value|tostring))
输出:
"tjh"
"number_of_logins:3"
"failed_attempts:3"
"locations:3"
"number_of_logins:4"
"failed_attempts:4"
"locations:4"
"number_of_logins:5"
"failed_attempts:5"
"locations:5"
这就像我以某种方式触发了完全的外部联接。
我怀疑我可能需要缩小或映射。
欢迎提出任何建议,用于测试jq的交互式网站URL和我的代码段在这里。
https://jqplay.org/s/QTk42jn-a0
谢谢
汤姆
答案 0 :(得分:1)
我不确定我是否理解您的问题,但这可能会让您入门。
jq -nr 'inputs
| [ .id, ( .records[] | .name + ":" + (.value | tostring) ) ]
| join (",")'
如果您希望在行首添加ID空间逗号,则可以这样做。
jq -nr 'inputs
| .id + " , " +
( [ .records[] | .name + ":" + (.value | tostring) ] | join (",") )'
我相信“数组/对象值迭代器:。[]”下的manual entry解释了为什么获得所看到的结果。
祝你好运!
答案 1 :(得分:1)
您可以对map
使用字符串插值:
.id + " , " + (.records | map("\(.name):\(.value)") | join(","))
甚至是插值法:
"\(.id) , \(.records | map("\(.name):\(.value)") | join(","))"