2016-04-15 70 views
1

我想使用jq来结合两个数组并运行一点麻烦。解析netdata json输出(mulltiple数组)与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 
] 

输入

如果你想自己抓住新的数据到t EST对,你可以使用以下命令:

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[]' 

我试图使用地图(),以及试图瓦尔分配到两个数组,然后打印出的对象在一起,但并不成功(如下图) 。

代码

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

我明白任何人的洞察力提前为我有点卡住,并希望能够做到这一切在JQ而不是使用在bash循环(如果可能的话)。

预计输出继电器

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

回答

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]]]; 
0

这里是处理其中第一个数组包含项名称和下面的阵列一般情况下的解决方案使用包含值转from_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.jqdata.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}