사전 형식의 일부 json 파일이 있습니다. 라인은 다음과 같습니다
{"a":"1", "b":"2", "c":"3", "time":1334572551435}
{"a":"1", "b":"2", "c":"4", "time":1334575352456}
{"a":"2", "b":"2", "c":"7", "time":1334575335345}
...
시간은 UTC 형식입니다. 전체 파일에는 약 3억 개의 고유 라인이 있습니다(아마도 동시에 두 번 정도). 특정 시간(예: 1334575352456
과 사이) 에 대한 회선을 어떻게 선택합니까 1334575353456
?
저는 개인적으로 일부 튜토리얼에서 다음 아이디어를 얻었습니다.
awk ’$"time" == 1334575352456, $"time" == 1334575353456’ inputfile.json
"time"
어쨌든, 이 솔루션은 키가 있는 dicts가 아닌 열용인 것 같습니다 "time"
(실제로 $"time"
는 그래야 합니다 $4
).
답변1
노력하다:
$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file
{"a":"1", "b":"2", "c":"4", "time":1334575352456}
-F'[:}]'
필드 구분 기호를 :
또는 }
로 설정하면 마지막에서 두 번째 필드에 액세스하여 시간 값에 액세스할 수 있습니다 $(NF-1)
.
출력을 저장하려면 다음을 사용하십시오.
$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file > output.txt
위의 조건이 있는 경우 해당 위치에서 편집하는 옵션을 gawk 4.1.0
사용할 수 있습니다 .-i
$ awk -i inplace -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file
답변2
입력은 JSON 개체 집합이므로 JSON 인식 도구를 사용하는 것이 좋습니다.
JSON 프로세서를 사용하여 값이 일부 값 과 시간 값 사이에 jq
있는 항목만 추출합니다 ( 여기에 사용된 옵션은 "컴팩트" 출력을 선택함).time
t0
t1
-c
jq -c --argjson t0 1334572551435 --argjson t1 1334575352456 \
'select(.time > $t0 and .time < $t1)' file
Miller ( ) 와 동일한 명령 mlr
이지만 시간 범위의 시작과 끝을 매개변수화하지 않습니다.
mlr --json filter '$time > 1334572551435 && $time < 1334575352456' file