我有以下 json 陣列:
{
"metric": {
"instance": "100.120.207.215:8081",
"job": "job1",
"error_code": "500"
},
"values": [
[
1665129206,
"128"
],
[
1665129236,
"129"
],
[
1665129266,
"130"
],
[
1665129296,
"135"
]
]
}
我想得到每個陣列之間的差異,看起來像
1665129236,1
1665129266,1
1665129296,5
請幫忙。非常感謝。
uj5u.com熱心網友回復:
如果陣列適合您的記憶,您可以制作兩份副本,將它們彼此分開,轉置和減去:
.values | [.[:-1], .[1:]] | transpose[]
| "\(.[1][0]),\(map(.[1] | tonumber) | .[1]-.[0])"
演示
或者,您可以使用foreach或while迭代兩個相鄰專案的視窗:
.values | foreach .[1:][] as $v ([null, .[0]]; .[1:] [$v];
"\(.[1][0]),\(map(.[1] | tonumber) | .[1]-.[0])"
)
演示
.values | while(has(1); .[1:])[:2]
| "\(.[1][0]),\(map(.[1] | tonumber) | .[1]-.[0])"
演示
輸出:
1665129236,1
1665129266,1
1665129296,5
uj5u.com熱心網友回復:
基于pmf 的出色回答:
.values[][1] |= tonumber
| [.values[1:], .values[:-1]]
| transpose[]
| [
first[0],
(map(last) | first-last)
]
| join(",")
由于您的所有值都是數字,因此最終join過濾器可以替換為@csv.
uj5u.com熱心網友回復:
derivative這是一個使用已在 SO 其他地方使用的通用函式的解決方案:
# Input: an array
# `delta` should be a non-negative integer, typically 1;
# p is the jq path expression to the quantity within an item, e.g. `.`
def derivative(delta; p):
. as $in
| [ range(delta; length) as $i
| .[$i]
| (p = ($in[$i] | p) - ($in[$i - delta] | p)) ];
.values |=
(map(.[1] |= tonumber)
| derivative( 1; .[1]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/513509.html
標籤:数组jsonjq
