[英]jq --stream filter on multiple values of same key
我正在处理一个非常大的 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
提前致谢!
从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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.