jq命令行,组合对象数组,我需要减少吗?还是地图?或者



我有一些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(","))"

相关内容

最新更新