使用 jq 在 tsv 中输出具有出现频率的元素的唯一值
using jq to output in tsv unique values of an element with frequency of occurrence
给定以下 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
}
我使用在 ubuntu 16.04 存储库中找到的 jq 版本
您可以试试这个 jq 过滤器:
jq -sr 'group_by(.new)|.[]|[.[0].new, length]|@tsv'
813 ROT 2
9878 SU 1
选项 -s
允许将文件的全部内容放入数组中(以将过滤器应用于全部内容)。
选项-r
显示原始数据。
group_by
函数将具有相同 new
键的所有对象分组到一个数组中。
.[0].new
获取key的值new
和length
获取相同值的key的个数
运算符 @tsv
格式化为制表符分隔值。
给定以下 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
}
我使用在 ubuntu 16.04 存储库中找到的 jq 版本
您可以试试这个 jq 过滤器:
jq -sr 'group_by(.new)|.[]|[.[0].new, length]|@tsv'
813 ROT 2
9878 SU 1
选项 -s
允许将文件的全部内容放入数组中(以将过滤器应用于全部内容)。
选项-r
显示原始数据。
group_by
函数将具有相同 new
键的所有对象分组到一个数组中。
.[0].new
获取key的值new
和length
获取相同值的key的个数
运算符 @tsv
格式化为制表符分隔值。