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로 연결된 두 개의 절로 나누는 이유를 이해할 수 없습니다 or. 조건문이 말하는 것과는 다릅니다.

어쨌든, 이는 올바른 기록을 캡처합니다. 이제 바닥글을 추가하기만 하면 됩니다. 가장 간단한 방법은 추가 단계를 수행하고 간결성을 위해 위의 select 절을 줄이는 것입니다.

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

복잡한 표현을 사용하여 이 작업을 수행하는 것도 가능하다고 생각 jq하지만 시도하지는 않았습니다.

관련 정보