用jq重组JSON文件:将数组中的值重组

时间:2019-03-06 17:17:49

标签: json group-by aggregate jq

我是jq的新手,我不太清楚如何转换格式如下的JSON文件:

[
  {
    "name": "person 1",
    "code": "AAA",
    "latitude": 11,
    "longitude": 22 
  },
  {
    "name": "person 2",
    "code": "AAA",
    "latitude": 11,
    "longitude": 22 
  },
  {
    "name": "person 3",
    "code": "BBB",
    "latitude": 33,
    "longitude": 44 
  },
  {
    "name": "person 4",
    "code": "BBB",
    "latitude": 33,
    "longitude": 44 
  }
]

对此:

[
  {
   "code": "AAA",
   "latitude": 11,
   "longitude": 22,
   "people": ["person 1", "person 2"]
  },
  {
   "code": "BBB",
   "latitude": 33,
   "longitude": 44,
   "people": ["person 3", "person 4"]
  }
]

我想出了如何使用map()unique来获得codelatitudelongitude的唯一组合,但是没有如何添加名称的方法放入数组。

3 个答案:

答案 0 :(得分:1)

这是使用group_by的简单解决方案:

group_by(.code)
| map( reduce .[] as $x (.[0] | del(.name); 
         .people += [$x.name]) )

答案 1 :(得分:1)

这是比使用group_by的解决方案更有效的解决方案,因为后者涉及一种排序。

可以使用内置的INDEX/1和通用函数aggregate_by定义为:

def aggregate_by(s; f; g):
  reduce s as $x  (null; .[$x|f] += [$x|g]);

aggregate_by(.[]; .code; .name) as $dict
| INDEX(.code)
| [.[]]
| map(del(.name) | .person = $dict[.code])

答案 2 :(得分:-1)

对于那些可能正在寻找替代品的人,这是基于 jtc 和标准的Unix实用程序的解决方案:

1。首先让我们对所有唯一的code进行排序:

bash $ jtc -w'<code>l:' file.json | sort -u 
"AAA"
"BBB"
bash $

2。然后将每个值通过xargs传递到jtc以通过name合并每个记录(就地应用结果,切换-f)。注意:下面,xarg的选项-t仅用于演示目的,并非真正需要:

bash $ jtc -w'<code>l:' file.json | sort -u | xargs -L1 -I{} -t jtc -w"[code]:<{}>[-1][name]" -mi'[code]:<{}>1:[-1][name]' -f file.json
jtc -w[code]:<AAA>[-1][name] -mi[code]:<AAA>1:[-1][name] -f file.json
jtc -w[code]:<BBB>[-1][name] -mi[code]:<BBB>1:[-1][name] -f file.json
bash $ 

3。最后删除所有合并的记录:

bash $ jtc -w'<code>l:' file.json | sort -u | xargs -L1 -I{} -t jtc -w"[code]:<{}>1: [-1]" -p -f file.json
jtc -w[code]:<AAA>1: [-1] -p -f file.json
jtc -w[code]:<BBB>1: [-1] -p -f file.json
bash $ 

file.json现在包含所需的结果:

bash $ cat file.json
[
   {
      "code": "AAA",
      "latitude": 11,
      "longitude": 22,
      "name": [
         "person 1",
         "person 2"
      ]
   },
   {
      "code": "BBB",
      "latitude": 33,
      "longitude": 44,
      "name": [
         "person 3",
         "person 4"
      ]
   }
]
bash $ 

***如果您想将标签name重命名为people,请应用其他步骤:

bash $ jtc -w'<name>l: <>v' -u'"people"' file.json 
[
   {
      "code": "AAA",
      "latitude": 11,
      "longitude": 22,
      "people": [
         "person 1",
         "person 2"
      ]
   },
   {
      "code": "BBB",
      "latitude": 33,
      "longitude": 44,
      "people": [
         "person 3",
         "person 4"
      ]
   }
]
bash $ 

jtc用户指南可以在这里找到:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md