キーの値を使用して内部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"}}}
2018-01-20のlocalDateまたは「2018-01-21」のlocalDateのように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クックブックから借りましょう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によって記述された最上位オブジェクトにはキーが1つしかないため、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")
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加