jq命令行,合并对象数组,我是否需要减少?还是地图?要么

时间:2018-12-14 00:40:54

标签: json stream jq data-munging

我有一些看起来像这样的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

谢谢

汤姆

2 个答案:

答案 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(","))"