jq - stream过滤同一个键的多个值

问题描述 投票:2回答:1

我正在处理一个非常大的JSON,其中我需要使用键的值来过滤内部JSON对象。我的JSON如下所示:

{"userActivities":{"L3ATRosRdbDgSmX75Z":{"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-20"},"L3ATSFGrpAYRkIIKqrh":{"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-21"},"L3AVHvmReBBPNGluvHl":{"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-22"},"L3AVIcqaDpZxLf6ispK":{"deviceId":"60ee32c2fae8dcf0","dow":"Friday,"localDate":"2018-01-19"}}}

我想对localDate值进行过滤,使得2018-01-20中的localDate或“2018-01-21”中的localDate使得输出看起来像。

{"userActivities":{"L3ATRosRdbDgSmX75Z":{"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-20"},"L3ATSFGrpAYRkIIKqrh":{"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-21"}}}

我在这里问了一个类似的问题,并意识到我需要对多个值进行过滤并保留JSON的原始结构。

https://stackoverflow.com/questions/52324497/how-to-filter-json-using-jq-stream

非常感谢提前!

json bigdata filtering jq
1个回答
1
投票

jq Cookbook,让我们借def atomize(s)

# Convert an object (presented in streaming form as the stream s) into
# a stream of single-key objects
# Examples:
#   atomize({a:1,b:2}|tostream)
#   atomize(inputs) (used in conjunction with "jq -n --stream")
def atomize(s):
  fromstream(foreach s as $in ( {previous:null, emit: null};
      if ($in | length == 2) and ($in|.[0][0]) != .previous and .previous != null
      then {emit: [[.previous]], previous: $in|.[0][0]}
      else { previous: ($in|.[0][0]), emit: null}
      end;
      (.emit // empty), $in) ) ;

由于OP描述的顶级对象只包含一个键,我们可以选择2018年8月的对象,如下所示:

atomize(1|truncate_stream(inputs))
| select( .[].localDate[0:7] == "2018-08")

如果您希望将这些收集到一个复合对象中,您可能必须小心内存,因此您可能希望将所选对象传递给另一个程序(例如awk或jq)。否则,我会选择:

def add(s): reduce s as $x (null; .+$x);

{"userActivities": add(
    atomize(1|truncate_stream(inputs | select(.[0][0] == "userActivities")))
    | select( .[].localDate[0:7] =="2018-01") ) }

变异

如果顶级对象具有多个键,则以下变体将是合适的:

atomize(1|truncate_stream(inputs | select(.[0][0] == "userActivities")))
| select( .[].localDate[0:7] =="2018-08")
© www.soinside.com 2019 - 2024. All rights reserved.