Получить счет на основе значения Bash - PullRequest
0 голосов
/ 09 июня 2018

У меня есть данные в этом формате в файле:

{"field1":249449,"field2":116895,"field3":1,"field4":"apple","field5":42,"field6":"2019-07-01T00:00:10","metadata":"","frontend":""}
{"field1":249448,"field2":116895,"field3":1,"field4":"apple","field5":42,"field6":"2019-07-01T00:00:10","metadata":"","frontend":""}
{"field1":249447,"field2":116895,"field3":1,"field4":"apple","field5":42,"field6":"2019-07-01T00:00:10","metadata":"","frontend":""}
{"field1":249443,"field2":116895,"field3":1,"field4":"apple","field5":42,"field6":"2019-07-01T00:00:10","metadata":"","frontend":""}
{"field1":249449,"field2":116895,"field3":1,"field4":"apple","field5":42,"field6":"2019-07-01T00:00:10","metadata":"","frontend":""}

Здесь каждая запись представляет строку.Я хочу иметь количество строк по отношению к значению в первом поле, например:

249449 : 2
249448 : 1
249447 : 1
249443 : 1

Как я могу получить это?

Ответы [ 4 ]

0 голосов
/ 10 июня 2018

Используя datamash и некоторые утилиты оболочки, измените разделители без данных на сжатые вкладки, поле счета 3 (это будет поле 2, но есть ведущая вкладка), обратный, затемкрасивая печать согласно OP spec:

tr -s '{":,}' '\t' < file | datamash -sg 3 count 3 | tac | xargs printf '%s : %s\n'

Вывод:

249449 : 2
249448 : 1
249447 : 1
249443 : 1
0 голосов
/ 09 июня 2018

с awk

$ awk -F'[,:]' -v OFS=' : ' '{a[$2]++} END{for(k in a) print k, a[k]}' file
0 голосов
/ 09 июня 2018

Вот эффективное jq -только решение:

reduce inputs.field1 as $x ({}; .[$x|tostring] += 1)
| to_entries[]
| "\(.key) : \(.value)"

Вызов: jq -nrf program.jq input.json

(обратите внимание, в частности, на параметр -n.)

Конечно, если объектное представление отсчетов удовлетворительное, тогда можно просто написать:

jq -n 'reduce inputs.field1 as $x ({}; .[$x|tostring] += 1)' input.json
0 голосов
/ 09 июня 2018

Вы можете использовать инструмент командной строки jq для интерпретации данных JSON.uniq -c подсчитывает количество вхождений.

% jq .field1 < $INPUTFILE | sort | uniq -c
      1 249443
      1 249447
      1 249448
      2 249449

(протестировано с jq 1.5-1-a5b5cbe на linux xubuntu 18.04 с zsh)

...