Json 基于值bash获取计数

Json 基于值bash获取计数,json,bash,shell,awk,jq,Json,Bash,Shell,Awk,Jq,我在一个文件中有这种格式的数据: {"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:

我在一个文件中有这种格式的数据:

{"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
我怎样才能得到它呢?

您可以使用命令行工具来解释JSON数据<代码>uniq-c统计发生的次数

% jq .field1 < $INPUTFILE | sort | uniq -c
      1 249443
      1 249447
      1 249448
      2 249449
%jq.field1<$INPUTFILE | sort | uniq-c
1 249443
1 249447
1 249448
2 249449
(在带有zsh的linux xubuntu 18.04上使用jq 1.5-1-a5b5cbe进行测试)

您可以使用命令行工具解释JSON数据<代码>uniq-c统计发生的次数

% jq .field1 < $INPUTFILE | sort | uniq -c
      1 249443
      1 249447
      1 249448
      2 249449
%jq.field1<$INPUTFILE | sort | uniq-c
1 249443
1 249447
1 249448
2 249449
(在带有zsh的linux xubuntu 18.04上使用jq 1.5-1-a5b5cbe进行测试)

使用awk进行测试

$ awk -F'[,:]' -v OFS=' : ' '{a[$2]++} END{for(k in a) print k, a[k]}' file
使用
awk

$ awk -F'[,:]' -v OFS=' : ' '{a[$2]++} END{for(k in a) print k, a[k]}' file

这里有一个高效的
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

这里有一个高效的
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
使用和一些shell util,将非数据分隔符更改为压缩制表符,计算字段3(可能是字段2,但有一个前导制表符),反转,然后按照操作规范进行漂亮打印:

使用和一些shell util,将非数据分隔符更改为压缩制表符,计算字段3(可能是字段2,但有一个前导制表符),反转,然后按照操作规范进行漂亮打印:


为什么2分配给249448,0分配给249443?这不是计数,这只是一个例子。应该是:249449:2 249448:1 249447:1 249443:1您试过什么?我们这里的大多数人都很乐意帮助您改进您的技能,但不太乐意担任短期无薪编程人员。向我们展示你迄今为止的工作,你期望的结果和你得到的结果,我们将帮助你找出答案。考虑到您的标记,我希望在您的问题中看到bash和awk代码。为什么2被分配给249448,0分配给249443?这不是计数,这只是一个例子。应该是:249449:2 249448:1 249447:1 249443:1您试过什么?我们这里的大多数人都很乐意帮助您改进您的技能,但不太乐意担任短期无薪编程人员。向我们展示你迄今为止的工作,你期望的结果和你得到的结果,我们将帮助你找出答案。考虑到您的标签,我希望在您的问题中看到bash和awk代码。应该是
$2
修复的。我建议您,因为这是最好的解决方案(IMO)…-只是想建议-v of s=':'在最后的print语句中do:print k,a[k]-认为它看起来会更干净。应该是
$2
修复的。我建议你,因为这是最好的解决方案(IMO)…-只是想建议-v of s=':'在最后的print语句中do:print k,a[k]-认为它看起来更干净。