Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jq处理包含整数列表的JSON文件_Json_List_Jq - Fatal编程技术网

使用jq处理包含整数列表的JSON文件

使用jq处理包含整数列表的JSON文件,json,list,jq,Json,List,Jq,我目前正在研究使用jq来处理包含整数列表的JSON文件,例如下面的示例- [ { "box_id": 1, "number_items": [ 4, 6, 7, 5 ] }, { "box_id": 3, "number_items": [ 15, null, 15, 9 ] }, { "box_id": 6, "nu

我目前正在研究使用
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
    ]
  }
]
首先,我试图获得每个
框id
的最大值。仅获取最大值相对简单,例如,
jq.[]

7
15
4
但是,我希望将其存储到一个新的JSON文件中,如下所示-

[
  {
    "box_id": 1,
    "max_items": 7
  },
  {
    "box_id": 3,
    "max_items": 15
  },
  {
    "box_id": 6,
    "max_items": 4
  }
]

另一部分更为复杂-如何为每个
框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

,对jq稍微熟悉一点,第一个问题是微不足道的,因此我只想给出一个解决方案:

map( {box_id, max_items: (.number_items | max) } )
第二个问题的要求有点不清楚,但是您可以轻松地调整以下内容以满足您的需要。首先,一个辅助函数,
差异

# 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;  
但是(从内存使用的角度来看)最好利用
差异
发出流的事实:

def sigma(s): reduce s as $x (0; . + $x);
map( {box_id, sumAD: ( sigma(.number_items | differences) ) } )

显示最终结果,包括绝对值
def sigma(s): reduce s as $x (0; . + $x);
map( {box_id, sumAD: ( sigma(.number_items | differences) ) } )