首页 > 解决方案 > 排序键后在一行中打印所有键和值

问题描述

我有一个文件夹,其中包含 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
  }
]

我需要找到所有唯一的输入请求。为此,我需要做两件事:

  1. 对键进行排序,input因为不同的输入可能具有相同的键但顺序不同
  2. 在一行中打印所有键和值,这样我就可以通过管道输出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"

标签: jsonjq

解决方案


这是一个“魔术表达式”,可以帮助您入门。
它用于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指出您希望对键进行排序,则可以formatunique. 例如

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

在线尝试!


推荐阅读