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