【问题标题】:Processing JSON files containing lists of integers using jq使用 jq 处理包含整数列表的 JSON 文件
【发布时间】:2017-06-27 14:46:02
【问题描述】:

我目前正在研究使用 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

【问题讨论】:

  • 显示最终结果,包括绝对值

标签: json list jq


【解决方案1】:

对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) ) } )

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2019-08-31
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多