script awk para excluir blocos no json

1

Eu tenho um arquivo JSON delimitado por nova linha com entradas como esta:

{"id":"eprints.ulster.ac.uk/view/year/2015.html","title":"Items where Year is 2015 - Ulster Institutional Repository","url":"eprints.ulster.ac.uk/view/year/2015.html"}
{"id":"eprints.ulster.ac.uk/view/year/2016.html","title":"Items where Year is 2016 - Ulster Institutional Repository","url":"eprints.ulster.ac.uk/view/year/2016.html"}
{"id":"eprints.ulster.ac.uk/view/year/2017.html","title":"Items where Year is 2017 - Ulster Institutional Repository","url":"eprints.ulster.ac.uk/view/year/2017.html"}
{"id":"eprints.ulster.ac.uk/10386/","title":"Structural performance of rotationally restrained steel columns in fire - Ulster Institutional Repos","url":"eprints.ulster.ac.uk/10386/"}
{"id":"eprints.ulster.ac.uk/10387/","title":"Determining the Effective Length of Fixed End Steel Columns in Fire - Ulster Institutional Repositor","url":"eprints.ulster.ac.uk/10387/"}

Eu só quero blocos onde o .id não comece com "eprints.ulster.ac.uk/view/"

Portanto, se o script foi executado no trecho de código acima, os primeiros 3 blocos seriam excluídos e os únicos blocos restantes seriam:

{"id":"eprints.ulster.ac.uk/10386/","title":"Structural performance of rotationally restrained steel columns in fire - Ulster Institutional Repos","url":"eprints.ulster.ac.uk/10386/"}
{"id":"eprints.ulster.ac.uk/10387/","title":"Determining the Effective Length of Fixed End Steel Columns in Fire - Ulster Institutional Repositor","url":"eprints.ulster.ac.uk/10387/"}

Alguém pode ajudar a escrever um script awk para fazer isso?

    
por KoreMike 03.10.2015 / 17:07

3 respostas

0

Veja como você solicitou especificamente uma solução Awk:

awk -F\" '$4 !~ /eprints.ulster.ac.uk\/view/' file > newfile
    
por 03.10.2015 / 19:56
0

Uma solução com jq .

cat test.json| jq 'select(.id|startswith("eprints.ulster.ac.uk/view/")|not )'

A sintaxe é bem simples se você estiver familiarizado com pipes.

Por exemplo

.id|startswith("eprints.ulster.ac.uk/view/")|not

significa que ele pega o campo .id de cada objeto e o canaliza através de startswith , que retorna um booleano e o booleano é negado.

Dê uma olhada no manual de jq para mais operadores e seletores.

    
por 03.10.2015 / 17:37
0

Para quem estiver interessado, passo a solução do Raphael para um novo arquivo JSON com este comando:

cat uir-index.json| jq 'select(.id|startswith("eprints.ulster.ac.uk/view/")|not )' > cleaned-uir-index.json

O formato de saída retornou aos blocos de código de várias linhas. Eu corri o mesmo comando jq com a opção "--compact-output / -c" assim:

cat uir-index.json| jq -c 'select(.id|startswith("eprints.ulster.ac.uk/view/")|not )' > cleaned-uir-index.json

Esta saída o arquivo limpo em formato de nova linha.

    
por 03.10.2015 / 19:14

Tags