Com os números corretos, uma tradução direta de suas condições funciona:
$ 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}
Observe o fechamento de '
e nenhum parêntese duplo. Eu não entendo porque você divide as condições em duas cláusulas and
conectadas por or
, não é isso que suas condições dizem.
De qualquer forma, isso captura os registros corretos; agora só temos que adicionar o rodapé. Isso é mais fácil com um passo adicional, encurtando a cláusula select de cima para brevidade:
jq -c 'select ...' file.json > out.json
printf '{"nt":%i}\n' 'wc -l < out.json' >> out.json
Acho que também é possível fazer isso com uma expressão jq
complicada, mas não tentei isso.