jqで複数のワイルドカードを使用してJSONファイルからオブジェクトを選択する

jqで複数のワイルドカードを使用してJSONファイルからオブジェクトを選択する

次の構造には、異なる値を持つ数千のレコードを行ごとに含むJSONファイルがあります。

例:

{"in": 5,"li": [{"st": 1508584161,"abc": 128416626,"ta": 33888}],"usr": {"is": "222108923573880","ie": "222108923573880"},"st2": 1508584161,"ei": {"ev": 0,"rt": 10},"rn": 947794,"st1": 1508584161}
{"in": 5,"li": [{"st": 1508584174,"abc": 128572802,"ta": 33504}],"usr": {"is": "222108923573880","ie": "222108923573880"},"st2": 1508584174,"ei": {"ev": 0,"rt": 19},"rn": 947795,"st1": 0}
{"in": 5,"li": [{"st": 1508584145,"abc": 279682,"ta": 50000}],"usr": {"is": "222108923573880","ie": "222108923573880"},"st2": 1508584145,"ei": {"ev": 0,"rt": 18},"rn": 947796,"st1": 1508584145}
{"in": 5,"li": [{"st": 1508584183,"abc": 1378680,"ta": 49840}],"usr": {"is": "222108923573880","ie": "222108923573880"},"st2": 1508584183,"ei": {"ev": 0,"rt": 10},"rn": 947797,"st1": 1508584186}
{"nt": 4}

JSONファイルで、次の基準に合ったオブジェクト(レコード)を選択して別のファイルに出力しようとしています。

st1 は < または = st2 です。

st1は0ではありません

st2は0ではありません

st1 は 2147483647 未満です。

st2 は 2147483647 未満です。

出力内の元のファイル({"nt":4})のフッターも、出力ファイル内になければ新しいレコード番号で編集できます。

出力ファイルの例:

{"in": 5,"li": [{"st": 1508584161,"abc": 128416626,"ta": 33888}],"usr": {"is": "222108923573880","ie": "222108923573880"},"st2": 1508584161,"ei": {"ev": 0,"rt": 10},"rn": 947794,"st1": 1508584161} 
{"nt": 1}

私は以下を持っています:

jq -c 'select((.st1 > 0 and .st2 > 0 and .st1 < .st2) or (.st1 < 214748647 and .st2 < 214748647 and .st1 > 0 and .st2 > 0 and .st1 < .st2)) file.json

さまざまな順列を試しましたが、正しい記録をキャプチャできませんでした。

ベストアンサー1

正しい数字を使用すると、自分のステータスを直接翻訳できます。

$ jq -c 'select(.st1 <= .st2 and 
                .st1 > 0 and .st2 > 0 and 
                .st1 < 2147483647 and .st2 < 2147483647)' file.json 
{"in":5,"li":[{"st":1508584161,"abc":128416626,"ta":33888}],"usr":{"is":"222108923573880","ie":"222108923573880"},"st2":1508584161,"ei":{"ev":0,"rt":10},"rn":947794,"st1":1508584161}
{"in":5,"li":[{"st":1508584145,"abc":279682,"ta":50000}],"usr":{"is":"222108923573880","ie":"222108923573880"},"st2":1508584145,"ei":{"ev":0,"rt":18},"rn":947796,"st1":1508584145}

閉じ括弧'と二重括弧がないことに注意してください。条件文andを2つの節に分割する理由を理解できませんor。条件文が言うものとは異なります。

とにかく、これは正しい記録をキャプチャします。フッターを追加するだけです。最も簡単な方法は、追加の手順を実行し、簡潔にするために上記のselect句を減らすことです。

jq -c 'select ...' file.json > out.json
printf '{"nt":%i}\n' `wc -l < out.json` >> out.json 

複雑な表現を使ってこれを行うことも可能だと思いますjqが、試していませんでした。

おすすめ記事