реструктурировать файл JSON с помощью значений jq: regroup в массиве

В моем случае у меня был

var http = require('http');
var path= require('path');

Как только я удалил строку http, это сработало для меня. Итак, я оставил только

var path = require ('path');

Я работал над express, mongodb, socket.io.

1
задан peak 6 March 2019 в 18:07
поделиться

2 ответа

Вот решение, которое более эффективно, чем решение, использующее 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])
0
ответ дан peak 6 March 2019 в 18:07
поделиться

для тех, кто может искать альтернативы, вот решение, основанное на 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 [ +1117]

0
ответ дан Dmitry 6 March 2019 в 18:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: