2017-01-12 17 views
0

Могу ли я использовать jq для запуска фильтра, который ведет себя так же, как и from_entries, с одним отличием, если встречается несколько записей для одного и того же ключа, он будет сопоставлять значения в массив, а не просто использовать последнее значение?вариант jq from_entries, который сопоставляет значения для каждого ввода ключа

Если да, то какой фильтр достигнет этого? Например, если мой вход:

[ 
    { 
    "key": "a", 
    "value": 1 
    }, 
    { 
    "key": "b", 
    "value": 2 
    }, 
    { 
    "key": "a", 
    "value": 3 
    }, 
    { 
    "key": "b", 
    "value": 4 
    } 
] 

то желаемый результат будет:

{ "a": [1,3], "b": [2,4] } 

Обратите внимание, что, используя «from_entries» отдельно в качестве фильтра, полученные значения являются только последнее значение (то есть, { "a": 3, "b": 4 })

ответ

1

С вашим примером и следующие строки в merge.jq:

def merge_entries: 
    reduce .[] as $pair ({}; .[$pair["key"]] += [$pair["value"]]); 

merge_entries 

призывание: JQ -c -f merge.jq выходы:

{"a":[1,3],"b":[2,4]} 

Вы также могли бы использовать призывание:

jq 'reduce .[] as $p ({}; .[$p.key] += [$p.value])' 
+0

Это прекрасно работает. Спасибо! – mwag

+0

Извините за неправильное использование оригинального вопроса. Я был отвлечен некоторыми аспектами первого абзаца. Даже сейчас он говорит «если существует несколько записей одного и того же ключа» без указания того, что следует делать, если это не так. – peak

+0

Нет, ты был прав. Я начал писать его с одного угла, затем переключился на полпути и не обновлял начало, чтобы сделать его последовательным. Я еще больше сужу и обновляюсь за ваш последний комментарий, надеюсь, теперь лучше, не стесняйтесь, если нет. Ty – mwag