次の構造には、異なる値を持つ数千のレコードを行ごとに含む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
が、試していませんでした。