我有一些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
谢谢,
Tom
我不确定我是否理解你的问题,但这可能会让你开始。
jq -nr 'inputs
| [ .id, ( .records[] | .name + ":" + (.value | tostring) ) ]
| join (",")'
如果您想在行首使用ID空间逗号空间,可以这样做。
jq -nr 'inputs
| .id + " , " +
( [ .records[] | .name + ":" + (.value | tostring) ] | join (",") )'
我相信"Array/Object Value Iterator:.[]"下的手动条目解释了您为什么会得到所看到的结果。
祝你好运!
您可以将字符串插值与map
:一起使用
.id + " , " + (.records | map("(.name):(.value)") | join(","))
甚至插值内的插值:
"(.id) , (.records | map("(.name):(.value)") | join(","))"