для тех, кто может искать альтернативы, вот решение, основанное на jtc
и стандартных утилитах Unix:
1. сначала рассортируем все уникальные code
:
bash $ jtc -w'l:' file.json | sort -u
"AAA"
"BBB"
bash $
2. затем передайте каждое значение через xargs
- jtc
, чтобы объединить каждую запись с помощью name
(применяя результат на месте, переключите -f
). Примечание: ниже опция xarg -t
дана только для демонстрационных целей и на самом деле не требуется:
bash $ jtc -w'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]:[-1][name] -mi[code]:1:[-1][name] -f file.json
jtc -w[code]:[-1][name] -mi[code]:1:[-1][name] -f file.json
bash $
3. наконец удалите все объединенные записи:
bash $ jtc -w'l:' file.json | sort -u | xargs -L1 -I{} -t jtc -w"[code]:<{}>1: [-1]" -p -f file.json
jtc -w[code]:1: [-1] -p -f file.json
jtc -w[code]: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'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]
Конечно, [::]
является оператором расширенного среза , Это позволяет вам брать подстроки. По сути, он работает, определяя, какие элементы вы хотите, как [begin: end: step], и работает для всех последовательностей. Об этом есть две полезные вещи:
Для начала и конца, если вы дать отрицательное число, это означает, что считать с конца последовательности. Например, если у меня есть список:
l = [1,2,3]
Тогда l [-1]
равно 3, l [-2]
равно 2 и l [-3]
равно 1.
Для аргумента step
отрицательное число означает работу в обратном направлении через последовательность. Так что для списка ::
l = [1,2,3,4,5,6,7,8,9,10]
Вы можете написать l [:: -1]
, что в основном означает использование шага размером -1 при чтении списка. Python будет «делать правильные вещи» при заполнении start и stop, поэтому он перебирает список в обратном направлении и дает вам [10,9,8,7,6,5,4,3,2,1]
.
Я привел примеры со списками, но строки - это просто другая последовательность и работают так же. Итак, a [:: - 1]
означает создание строки путем объединения символов, которые вы получаете, проходя назад по строке.
a [:: - 1]
означает создание строки путем объединения символов, которые вы получаете, проходя назад по строке. но строки - это просто другая последовательность и работают так же. Итак, a [:: - 1]
означает создание строки путем объединения символов, которые вы получаете, проходя назад по строке. строка - это, по сути, последовательность символов, поэтому с ней работает операция среза. То, что вы делаете, на самом деле:
-> получить часть «а» от начала до конца с шагом 1 назад.
Используется расширенное срезание - строка в Python является последовательностью, и разделяет некоторые методы с другими последовательностями (а именно списками и кортежами). Нарезка состоит из трех частей - начало, остановка и шаг. Все они имеют значения по умолчанию - начальные значения по умолчанию равны 0, конечные значения по умолчанию равны len (sequence), а значение шага по умолчанию равно 1. Указывая [:: - 1], вы говорите «все элементы в последовательности a, начиная с начала до конца, возвращаясь назад по одному.
Эта функция была введена в Python 2.3.5, и вы можете прочитать больше в Что нового в документах .
[:: - 1] дает фрагмент строки a. полный синтаксис: a [begin: end: step]
который дает [начало], [начало + шаг], ... а [конец-1]. Когда шаг отрицательный, вы начинаете с конца и переходите к началу.
Наконец, начинаются значения по умолчанию с начала последовательности, с конца до конца и с шагом -1.
sequence[start:end:step]
В в этом случае шаг -1 означает задом наперед, а пропуск начала и конца означает, что вам нужна вся строка.
Это называется нотация слайсов в Python, и вы можете прочитать немного больше о том, как это работает здесь:
Я думаю, что следующее имеет немного больше смысла для печати строк в обратном порядке, но, возможно, это только я:
for char in reversed( myString ):
print( char, end = "" )
Часть "-1" представляет часть "шага" среза - в этом случае она проходит через строка 1 символ за раз, но в обратном направлении (отрицательный шаг означает начало с конца строки). Например, если указать шаг равным 2, вы получите все остальные символы строки, начиная с первого. Если вы укажете шаг -2, вы получите все остальные символы строки, начиная с последнего символа и работая в обратном направлении.
Итак, в двух словах, если a = '12345'
:
a [:: 2]
становится 135
a [:: - 1]
становится 54321
a [:: - 2]
становится 531