使用jq在tsv中输出出现频率的元素的唯一值

时间:2018-11-09 11:37:48

标签: csv jq frequency-distribution

给出以下json,我如何创建一个tsv,该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
}

我使用在ubuntu 16.04存储库中找到的jq版本

1 个答案:

答案 0 :(得分:1)

您可以尝试以下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格式化为制表符分隔的值。