json - 排序键后在一行中打印所有键和值
问题描述
我有一个文件夹,其中包含 1000 多个请求日志(每小时/每天生成),格式如下:
[
{
"input": {
"random_param_name_1": "random_value_1",
"random_param_name_2": "random_value_2",
"random_param_name_3": "random_value_3",
"random_param_name_4": "random_value_4"
},
"output": {
"some_key_we_dont_care_about": "some_value_we_dont_care_about"
},
"status_code": 200
},
{
"input": {
"random_param_name_1": "random_value_1",
"random_param_name_4": "random_value_4",
"random_param_name_3": "random_value_3",
"random_param_name_5": "random_value_5"
},
"output": {
"some_key_we_dont_care_about": "some_value_we_dont_care_about"
},
"status_code": 200
}
]
我需要找到所有唯一的输入请求。为此,我需要做两件事:
- 对键进行排序,
input
因为不同的输入可能具有相同的键但顺序不同 - 在一行中打印所有键和值,这样我就可以通过管道输出
sort | uniq
来获取所有唯一的输入组合。
请注意,输入键是随机的,stackoverflow 中类似类型的大多数现有问题,提前知道键,但这里不是这种情况。
我可以像这样打印键和值:
jq -r 'keys[] as $k | "\($k):(.[$k])"'
但他们最终走上了新的道路。
总结一下,对于上面的 json,我需要一个magic_expression
$ jq 'magic_expression' log.json
那将返回
"random_param_name_1":"random_value_1","random_param_name_2":"random_value_2","random_param_name_3":"random_value_3","random_param_name_4":"random_value_4"
"random_param_name_1":"random_value_1","random_param_name_3":"random_value_3","random_param_name_4":"random_value_4","random_param_name_5":"random_value_5"
解决方案
这是一个“魔术表达式”,可以帮助您入门。
它用于to_entries
使显示的对象.input
更易于管理。
def format: "\"\(.key)\":\"\(.value)\"" ;
map(.input) | unique | map(to_entries)[] | map(format) | join(",")
当使用-r
/运行时,--raw-output
它会产生
"random_param_name_1":"random_value_1","random_param_name_2":"random_value_2","random_param_name_3":"random_value_3","random_param_name_4":"random_value_4"
"random_param_name_1":"random_value_1","random_param_name_4":"random_value_4","random_param_name_3":"random_value_3","random_param_name_5":"random_value_5"
编辑:如果customcommander指出您希望对键进行排序,则可以format
将unique
. 例如
def format: "\"\(.key)\":\"\(.value)\"" ;
map(.input | to_entries | map(format) | sort ) | unique[] | join(",")
产生
"random_param_name_1":"random_value_1","random_param_name_2":"random_value_2","random_param_name_3":"random_value_3","random_param_name_4":"random_value_4"
"random_param_name_1":"random_value_1","random_param_name_3":"random_value_3","random_param_name_4":"random_value_4","random_param_name_5":"random_value_5"
当使用-r
/运行时--raw-output
推荐阅读
- tensorflow - Tensorflow Object-Detection API - 模型的微调是如何工作的?
- python - 如何在 localtime() 变量中保持时间最新
- reactjs - 高阶组件和验证路由
- html - 属性getter调用函数不能绑定?
- yocto - 如何安装没有自己的配方的 python 模块?
- java - 无法让 mockito 模拟公共类的公共方法
- ruby-on-rails - 如何输出更多信息来记录此错误?
- apex - 有没有办法防止方括号被插入到我的字符串中?
- javascript - 如何使用回调函数修复错误?
- uwp - 通用 Windows App Store 试用许可剩余时间不正确