首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jq处理包含整数列表的JSON文件

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

Stack Overflow用户
提问于 2017-06-27 22:46:03
回答 1查看 60关注 0票数 1

我目前正在研究使用jq来处理包含整数列表的JSON文件,例如下面的示例:

代码语言:javascript
复制
[
  {
    "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获取最大值是相对简单的,它返回

代码语言:javascript
复制
7
15
4

但是,我想将其存储到一个新的JSON文件中,如下所示-

代码语言:javascript
复制
[
  {
    "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]的情况下,我们得到对应于差异[0,-6]和绝对和6[15,15,9]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-28 00:58:48

只要稍微熟悉一下jq,第一个问题就微不足道了,所以我就不多说了,只给出一个解决方案:

代码语言:javascript
复制
map( {box_id, max_items: (.number_items | max) } )

第二个问题的要求有点不明确,但您可以轻松地调整以下内容以满足您的需求。首先,是一个助手函数differences

代码语言:javascript
复制
# 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;  

然后你可以这样使用它:

代码语言:javascript
复制
map( {box_id, sumAD: ( [.number_items | differences] | add) } )

然而,(从内存使用的角度)利用differences发出流的事实会更好:

代码语言:javascript
复制
def sigma(s): reduce s as $x (0; . + $x);
map( {box_id, sumAD: ( sigma(.number_items | differences) ) } )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44783294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档