使用 jq 获取给定键及其父键的值

使用 jq 获取给定键及其父键的值

我有一个 JSON 对象,如下所示:

{
  "1": {
    "available_memory": 1086419656.0,
    "available_memory_no_overbooking": 1086419656.0,
    "conns": 1.0
  },
  "2": {
    "available_memory": 108641236.0,
    "available_memory_no_overbooking": 10861216.0,
    "conns": 2.0
  }
}

我想检索每个对象 ID 的“conns”属性的值。我是 jq 的新人,我找不到明确的例子。

我已经尝试过以下方法:

echo "$OUTPUT" | jq -r .[].conns

它返回 conns 的所有值,但这不是我需要的。预计的输出将是:

1 1.0
2 2.0

有任何想法吗?

答案1

$ jq -r 'keys[] as $k | "\($k) \(.[$k].conns)"' file.json
1 1
2 2

似乎 jq 将 1.0 转换为 1,将 2.0 转换为 2。为了清楚起见,更改输入:

$ cat file.json
{
  "1a": {
    "available_memory": 1086419656.0,
    "available_memory_no_overbooking": 1086419656.0,
    "conns": 1.1
  },
  "2b": {
    "available_memory": 108641236.0,
    "available_memory_no_overbooking": 10861216.0,
    "conns": 2.2
  }
}
$ jq -r 'keys[] as $k | "\($k) \(.[$k].conns)"' file.json
1a 1.1
2b 2.2

参考文献:

答案2

替代解决方案jtc使用一些标准 cli 来简化提问:

bash $ echo $OUTPUT | jtc -rl -w'[+0]' -w'[+0][conns]' | sed 's/: {.*//g; s/^"conns"://' | xargs -n2
1 1.0
2 2.0
bash $ 

jtc(与 jq 不同)是一个实用程序,它将其功能仅限于 json 操作(因此其界面非常简单),但是在 JSON 数据模型之外操作文章被卸载到外部 unix 工具

编辑:新版本jtc支持更简单的解决方案:

bash $ jtc -w'<conns>l:<con>v[-1]<key>k' -T '"{key} {con}"' -qq <<<$OUTPUT
1 1.0
2 2.0
bash $ 

相关内容