【问题标题】:Parse netdata json output (mulltiple arrays) with jq用 jq 解析 netdata json 输出(多个数组)
【发布时间】:2016-04-15 14:03:30
【问题描述】:

我正在尝试使用 jq 组合两个数组,但遇到了一些麻烦。

我正在尝试从 netdata (netdata.firehol.org) 中解析出数据,而我感兴趣的 json 响应中的两条数据都是数组的一部分。第一个数组是标签第二个数组中的数据点。

示例输入

[
  "time",
  "guest_nice", 
  "guest",
  "steal",
  "softirq",
  "irq",
  "user",
  "system",
  "nice",
  "iowait"
]
[
  1460728600,
  0,
  0,
  0,
  0.45731,
  0,
  0.25108,
  11.74702,
  48.22465,
  0
]

输入

如果您想自己获取新数据进行测试,可以使用以下方法:

curl -s -X GET --header 'Accept: application/json' 
'http://netdata.firehol.org/api/v1/data?chart=system.cpu&after=-10&before=0&points=1&group=average&format=json&options=seconds%2Cjsonwrap' | jq '.result.labels, .result.data[]'

我尝试使用 map() 以及尝试将 vars 分配给两个数组,然后一起打印出对象,但都没有成功(如下)。

代码

 | jq '.result.labels as $labels | .result.data[] as $data | .result.data[] | Label: $labels[.], data: $data[.]}'

感谢任何人提前提供的见解,因为我有点卡住了,并且希望能够在 jq 中完成这一切,而不是在 bash 中使用 for 循环(如果可能的话)。

预期输出

{ “时间”:“1460728600”, "guest_nice": "0", ... }

【问题讨论】:

    标签: arrays json jq


    【解决方案1】:

    您还没有具体说明您希望如何组合数组,但一种方法是使用transpose,在这种情况下它实际上是一种zip。例如:

    $ jq -n -c '[["a","b"], [1,2]] | transpose'
    

    产量:[["a",1],["b",2]]

    如果你想要一个对象数组,那么使用相同的输入,

    transpose | map( { (.[0]) : .[1] } )
    

    将产生:[{"a":1},{"b":2}]

    如果你的 jq 没有transpose,这里是它的定义:

    # transpose a possibly jagged matrix, quickly;
    # rows are padded with nulls so the result is always rectangular.
    def transpose:
      [range(0; (map(length) | max)) as $j 
       | [range(0; length) as $i | .[$i][$j] ] ] ;
    

    或者,如果您想要一个非常简短的zip

    def zip: [range(0; .[0]|length) as $i | [.[0][$i], .[1][$i]]];
    

    【讨论】:

      【解决方案2】:

      这是一个处理一般情况的解决方案,其中第一个数组包含键名,以下数组包含使用 transposefrom_entries

      的值
        {h:.[0], v:.[1:][]}                        # {h:[keys], v:[values]}
      | [.h, .v]                                   # [ [keys], [values] ] ...
      | [ transpose[] | {key:.[0], value:.[1]} ]   # [ {"key":key, "value":value}, ... ]
      | from_entries                               # { key:value, key:value, ... }
      

      例如,如果这个过滤器在filter.jq 并且data.json 包含

      ["time","guest_nice","guest","steal","softirq","irq","user","system","nice","iowait"]
      [1460728600,0,0,0,0.45731,0,0.25108,11.74702,48.22465,0]
      [1460728601,0,0,0,0.45732,0,0.25109,12.74703,49,0]
      

      然后是命令

      jq -M -s -c -f filter.jq data.json
      

      生产

      {"time":1460728600,"guest_nice":0,"guest":0,"steal":0,"softirq":0.45731,"irq":0,"user":0.25108,"system":11.74702,"nice":48.22465,"iowait":0}
      {"time":1460728601,"guest_nice":0,"guest":0,"steal":0,"softirq":0.45732,"irq":0,"user":0.25109,"system":12.74703,"nice":49,"iowait":0}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多