Pegue o subconjunto do arquivo relacionado ao registro de data e hora

1

Eu tenho alguns arquivos json em formato de dicionário. As linhas parecem aqui:

{"a":"1", "b":"2", "c":"3", "time":1334572551435}
{"a":"1", "b":"2", "c":"4", "time":1334575352456}
{"a":"2", "b":"2", "c":"7", "time":1334575335345}
...

a hora está no formato UTC. O arquivo inteiro tem cerca de 300 milhões de linhas únicas (de qualquer maneira, o mesmo tempo pode vir duas vezes). Como posso escolher linhas por algum tempo específico, por exemplo, entre 1334575352456 e 1334575353456 ?

Eu pessoalmente tenho a próxima ideia de algum tutorial:

awk ’$"time" == 1334575352456, $"time" == 1334575353456’ inputfile.json

de qualquer forma, suponho que essa solução seja para a coluna "time" , não para o dicionário com a chave "time" (na verdade $"time" deve ser $4 )

    
por Guforu 15.09.2014 / 11:41

1 resposta

3

Tente:

$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file
{"a":"1", "b":"2", "c":"4", "time":1334575352456}
O delimitador

-F'[:}]' set fields é : ou } , para que você possa acessar o valor de tempo acessando o segundo do último campo, usando $(NF-1) .

Para salvar a saída, use:

$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file > output.txt

Se você tem gawk 4.1.0 e acima, você pode usar a opção -i para fazer a edição no local:

$ awk -i inplace -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file
    
por 15.09.2014 / 11:48