我目前正在研究使用jq
来处理包含整数列表的JSON文件,例如下面的示例 -
[
{
"box_id": 1,
"number_items": [
4,
6,
7,
5
]
},
{
"box_id": 3,
"number_items": [
15,
null,
15,
9
]
},
{
"box_id": 6,
"number_items": [
2,
4,
0,
1
]
}
]
首先,我试图获得每个box_id
的最大值。获得最大值相对简单,例如jq '.[].number_items | max
,返回
7
15
4
但是,我想将其存储到一个新的JSON文件中,如此 -
[
{
"box_id": 1,
"max_items": 7
},
{
"box_id": 3,
"max_items": 15
},
{
"box_id": 6,
"max_items": 4
}
]
另一部分涉及更多 - 如何找到每个box_id
列表中连续条目的绝对差异总和?例如,请考虑[4,6,7,5]
,它对应于差异[6-4=2, 7-6=1, 5-7=-2]
= [2,1,-2]
。该值的绝对值之和为2+1+2
= 5
。请注意,列表可以包含null
个值。应删除这些条目,以便在[15,null,15,9]
的情况下,我们得到的[15,15,9]
对应于差异[0,-6]
和绝对和6
。
答案 0 :(得分:2)
对jq有一点了解,第一个问题是微不足道的,所以我不会只提出解决方案:
map( {box_id, max_items: (.number_items | max) } )
第二个问题的要求有点不清楚,但您可以轻松调整以下内容以满足您的需求。首先,辅助函数differences
:
# Input: an array
# Output: a non-empty stream of non-negative integers
def differences:
def abs: if . < 0 then - . else . end;
map( select(. != null) )
| if length == 0 then 0
elif length == 1 then (.[0]|abs)
else range(1;length) as $i | ( .[$i] - .[$i - 1] ) | abs end;
然后您可以像这样使用它:
map( {box_id, sumAD: ( [.number_items | differences] | add) } )
然而,(从内存使用的角度来看)利用differences
发出流的事实会更好:
def sigma(s): reduce s as $x (0; . + $x);
map( {box_id, sumAD: ( sigma(.number_items | differences) ) } )