타임스탬프와 관련된 파일의 하위 집합 가져오기

타임스탬프와 관련된 파일의 하위 집합 가져오기

사전 형식의 일부 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있는 항목만 추출합니다 ( 여기에 사용된 옵션은 "컴팩트" 출력을 선택함).timet0t1-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

관련 정보