используя jq для вывода в tsv уникальных значений элемента с частотой встречаемости - PullRequest
0 голосов
/ 09 ноября 2018

учитывая следующий json, как я могу создать tsv, который бы выводил частоты найденных в нем значений (в новом элементе)?

{"_id":{"$someid":"545"},"new":"813 ROT","old":{"$someid":"5fe"}}
{"_id":{"$someid":"659889a"},"new":"9878 SU","old":{"$someid":"5bc"}}
{"_id":{"$someid":"986978754b"},"new":"813 ROT","old":{"$someid":"5bc1af"}}

желаемый вывод:

813 ROT 2
9878 SU 1

я могу извлечь значения с помощью .new, но не знаю, как их сгруппировать и создать tsv, тогда

что я пробовал:

def counter(stream):   reduce stream as $s ({}; .[$s|tostring] += 1);  counter(inputs | .new) | to_entries[] | {ItemId: (.key), Count: .value}

но выдает:

{
  "ItemId": "9878 SU",
  "Count": 1
}
{
  "ItemId": "813 ROT",
  "Count": 1
}

я использую версию jq, найденную в репозиториях Ubuntu 16.04

1 Ответ

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

Вы можете попробовать этот фильтр JQ:

jq -sr 'group_by(.new)|.[]|[.[0].new, length]|@tsv'
813 ROT 2
9878 SU 1

Параметр -s позволяет получить полное содержимое файла в массив (применить фильтр к полному содержимому).

Параметр -r отображает необработанные данные.

Функция group_by группирует в массив все объекты, имеющие одинаковый ключ new.

.[0].new получает значение ключа new и length номер ключа с таким же значением.

Оператор @tsv форматирует в значения, разделенные табуляцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...