我在一个文件中有这种格式的数据:
{"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":""}
在这里,每个条目代表一行。我希望获得与字段1中的值相关的行数,如下所示:
249449 : 2
249448 : 1
249447 : 1
249443 : 1
我怎么才能做到这一点?
发布于 2018-06-09 23:40:30
使用awk
$ awk -F'[,:]' -v OFS=' : ' '{a[$2]++} END{for(k in a) print k, a[k]}' file
发布于 2018-06-09 18:17:26
您可以使用jq命令行工具来解释JSON数据。uniq -c
计算出现的次数。
% jq .field1 < $INPUTFILE | sort | uniq -c
1 249443
1 249447
1 249448
2 249449
(在带有zsh的Linuxxubuntu18.04上使用jq 1.5-1-a5b5cbe
测试)
发布于 2018-06-10 01:07:29
这是一个高效的jq
-only解决方案:
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
https://stackoverflow.com/questions/50773151
复制相似问题