Как получить только дубликаты ключей в JSON через JQ? - PullRequest
0 голосов
/ 30 ноября 2018

Я прочитал все ответы в руководстве по stackoverflow и jq, но не могу найти и понять, какие варианты необходимо использовать для решения следующей задачи:

jq '.result [] |"\ (. name) \ (. content)" ':

"test.mydomain.com 123.123.123.123"
"static.mydomain.com 124.124.124.124"
"static.mydomain.com 124.124.124.128"
"mydomain.com 125.125.125.125"
"mydomain.com 125.125.125.126"
"mydomain.com 125.125.125.127"

Нужно получать из этого списка только дубликаты за первое значение:

"mydomain.com 125.125.125.125"
"mydomain.com 125.125.125.126"
"mydomain.com 125.125.125.127"
"static.mydomain.com 124.124.124.124"
"static.mydomain.com 124.124.124.128"

Извините за Вашвремя

С уважением

1 Ответ

0 голосов
/ 30 ноября 2018

Давайте сделаем это проще, используя универсальную служебную функцию (возможно, подходящую для вашей стандартной библиотеки jq):

# In this formulation, f must either always evaluate to a string or always to an integer
# it being understood that negative integers might be problematic
def aggregate_by(f; g):
  reduce .[] as $x  (null; .[$x|f] += [$x|g]);

Используя опцию -s ("slurp"), задача теперь может быть разбитав следующие шаги:

map(split(" "))
| aggregate_by(.[0]; .[1])
| with_entries(select(.value|length > 1))
| to_entries[]
| .key as $k | .value[] | [$k, .]
| join(" ")

Вывод (на основе оригинального примера)

"mydomain.com 125.125.125.125"
"mydomain.com 125.125.125.126"

Вывод (на основе пересмотренного примера)

"static.mydomain.com 124.124.124.124"
"static.mydomain.com 124.124.124.128"
"mydomain.com 125.125.125.125"
"mydomain.com 125.125.125.126"
"mydomain.com 125.125.125.127"
...