Dois OPs consecutivos após o pipe ou dois jq OPs em uma execução?

1

Eu tenho que extrair dados de uma string JSON ligeiramente mal-formatada, portanto, eu a passo primeiro através de sed & %código%. O que eu tenho é um comando como:

'sed 's/},/},\n/g' test.json |awk '/"characater"/ { gsub("\"characater\"", "\"char" ++n "\"", $0) } 1'| jq -r '.frames.frame.lps.lp|.characters[]|[.code_ascii,.confidence]|@tsv'' 

para extrair dados de uma string JSON que pode ser vista aqui:

{"response":{"container":{"id":"41d6efcb-24d6-490d-8880-762255519b5f","timestamp":"2018-Jul-11 19:51:06.461665"},"id":"00000002-0000-0000-0000-000000000015"},"frames":{"frame":{"id":"5583","timestamp":"2016-Nov-30 13:05:27","lps":{"lp":{"licenseplate":"15451BBL","text":"15451BBL","wtext":"15451BBL","confidence":"20","bkcolor":"16777215","color":"16777215","type":"0","ntip":"11","cct_country_short":"","cct_state_short":"","tips":{"tip":{"poly":{"p":{"x":"1094","y":"643"},"p":{"x":"1099","y":"643"},"p":{"x":"1099","y":"667"},"p":{"x":"1094","y":"667"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"97"},"tip":{"poly":{"p":{"x":"1103","y":"642"},"p":{"x":"1113","y":"642"},"p":{"x":"1112","y":"667"},"p":{"x":"1102","y":"667"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"89"},"tip":{"poly":{"p":{"x":"1112","y":"640"},"p":{"x":"1122","y":"640"},"p":{"x":"1122","y":"666"},"p":{"x":"1112","y":"666"}},"bkcolor":"16777215","color":"0","code":"52","code_ascii":"4","confidence":"97"},"tip":{"poly":{"p":{"x":"1123","y":"640"},"p":{"x":"1132","y":"640"},"p":{"x":"1131","y":"665"},"p":{"x":"1123","y":"665"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"97"},"tip":{"poly":{"p":{"x":"1134","y":"640"},"p":{"x":"1139","y":"640"},"p":{"x":"1139","y":"664"},"p":{"x":"1133","y":"664"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"77"},"tip":{"poly":{"p":{"x":"1154","y":"639"},"p":{"x":"1163","y":"639"},"p":{"x":"1163","y":"663"},"p":{"x":"1153","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"97"},"tip":{"poly":{"p":{"x":"1164","y":"638"},"p":{"x":"1173","y":"638"},"p":{"x":"1173","y":"663"},"p":{"x":"1163","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"94"},"tip":{"poly":{"p":{"x":"1191","y":"637"},"p":{"x":"1206","y":"636"},"p":{"x":"1205","y":"660"},"p":{"x":"1190","y":"661"}},"bkcolor":"16777215","color":"0","code":"76","code_ascii":"L","confidence":"34"},"tip":{"poly":{"p":{"x":"1103","y":"655"},"p":{"x":"1111","y":"655"},"p":{"x":"1111","y":"667"},"p":{"x":"1103","y":"667"}},"bkcolor":"16777215","color":"0","code":"74","code_ascii":"J","confidence":"57"},"tip":{"poly":{"p":{"x":"1103","y":"655"},"p":{"x":"1111","y":"655"},"p":{"x":"1111","y":"667"},"p":{"x":"1103","y":"667"}},"bkcolor":"16777215","color":"0","code":"74","code_ascii":"J","confidence":"57"},"tip":{"poly":{"p":{"x":"1176","y":"638"},"p":{"x":"1185","y":"637"},"p":{"x":"1184","y":"661"},"p":{"x":"1175","y":"662"}},"bkcolor":"16777215","color":"0","code":"52","code_ascii":"4","confidence":"7"}},"ncharacter":"8","characters":{"characater":{"poly":{"p":{"x":"1094","y":"643"},"p":{"x":"1099","y":"643"},"p":{"x":"1099","y":"667"},"p":{"x":"1094","y":"667"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"97"},"characater":{"poly":{"p":{"x":"1103","y":"642"},"p":{"x":"1113","y":"642"},"p":{"x":"1112","y":"667"},"p":{"x":"1102","y":"667"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"89"},"characater":{"poly":{"p":{"x":"1112","y":"640"},"p":{"x":"1122","y":"640"},"p":{"x":"1122","y":"666"},"p":{"x":"1112","y":"666"}},"bkcolor":"16777215","color":"0","code":"52","code_ascii":"4","confidence":"97"},"characater":{"poly":{"p":{"x":"1123","y":"640"},"p":{"x":"1132","y":"640"},"p":{"x":"1131","y":"665"},"p":{"x":"1123","y":"665"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"97"},"characater":{"poly":{"p":{"x":"1134","y":"640"},"p":{"x":"1139","y":"640"},"p":{"x":"1139","y":"664"},"p":{"x":"1133","y":"664"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"77"},"characater":{"poly":{"p":{"x":"1154","y":"639"},"p":{"x":"1163","y":"639"},"p":{"x":"1163","y":"663"},"p":{"x":"1153","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"97"},"characater":{"poly":{"p":{"x":"1164","y":"638"},"p":{"x":"1173","y":"638"},"p":{"x":"1173","y":"663"},"p":{"x":"1163","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"94"},"characater":{"poly":{"p":{"x":"1191","y":"637"},"p":{"x":"1206","y":"636"},"p":{"x":"1205","y":"660"},"p":{"x":"1190","y":"661"}},"bkcolor":"16777215","color":"0","code":"76","code_ascii":"L","confidence":"34"}},"det_time_us":"1072592","poly":{"p":{"x":"1088","y":"642"},"p":{"x":"1210","y":"634"},"p":{"x":"1210","y":"661"},"p":{"x":"1087","y":"669"}}}},"det_time_us":"1720812"}}}

ou neste link: link
Agora, isso funciona bem, mas o que eu preciso é extrair o awk do JSON também. Eu sei que eu poderia simplesmente fazer algo como .frames.frame.lps.lp.ncharacter na frente do acima, mas isso não funcionará, já que eu preciso desses comandos para analisar um arquivo enorme de strings JSON que são formatadas como visto no link e eu preciso do cat test.json | jq -r '.frames.frame.lps.lp.ncharacter'; parâmetro para mostrar em linha com os caracteres extraídos o que significa que eu gostaria de ter uma saída como:

...
X       99
Y       99 previous data formatted in the same way
8
1       97
5       89
4       97
5       97
1       77
B       97
B       94
L       34
6          following data formatted in the same way
Z       99
...

Onde o 8 na parte superior é o parâmetro .ncharacter . Eu tentei:

sed 's/},/},\n/g' test.json |awk '/"characater"/ { gsub("\"characater\"", "\"char" ++n "\"", $0) } 1'| jq -r '[.frames.frame.lps.lp.ncharacter],.frames.frame.lps.lp|.characters[]|[.code_ascii,.confidence]|@tsv'

mas isso me dá .ncharacter e não sei por que isso é ...

    
por cerr 13.07.2018 / 19:17

1 resposta

2

Verifique isso:

Primeira variante

perl -pe 's/"characater"/"\"char" . (++$n) . "\""/ge' input.json |
jq -r '.frames.frame.lps.lp|.ncharacter,(.characters[]|[.code_ascii,.confidence]|@tsv)'

Explicação

  1. perl -pe 's/"characater"/"\"char" . (++$n) . "\""/ge' input.json

    • -p - percorre cada linha e imprime, como sed .
    • -e - pode ser usado para inserir uma linha de programa. Se -e for fornecido, o Perl não procurará um nome de arquivo na lista de argumentos.
    • s///ge - g : substituição global, e : avalie a parte direita do comando de substituição como uma expressão.
    • "\"char" . (++$n) . "\"" - os pontos são usados para concatenação.
  2. jq -r '.frames.frame.lps.lp|.ncharacter,(.characters[]|[.code_ascii,.confidence]|@tsv)'

    • .frames.frame.lps.lp| - pode ser escrito como .frames | .frame | .lps | .lp | , por isso funciona assim: pegue a entrada, escolha todos os campos frames e canalize-os para o outro filtro - .frame , depois use todos os campos frame e pipe -los para o próximo filtro - .lps , assim por diante. Consulte o Manual do jq , a seção Tubo .
    • |.ncharacter,(.characters[]|...)' - Manual jq , a seção Vírgula : "Se dois filtros forem separados por uma vírgula, então a mesma entrada será alimentada em ambos e os fluxos de valor de saída dos dois filtros serão concatenados em ordem: primeiro, todas as saídas produzidas pela expressão esquerda e, em seguida, todas as saídas produzidas pela direita. Por exemplo, filtre .foo, .bar , produz os campos "foo" e "bar" como saídas separadas. "
    • (.characters[]|[.code_ascii,.confidence]|@tsv) - parênteses são usados para processar a saída de .characters[] separadamente da saída do filtro .ncharacter .

Segunda variante - usando a correção do arquivo gawk perl para json , a parte jq é a mesma da primeira variante:

gawk '{ORS= (RT) ? "\"char" NR "\"" : ""; print}' RS='"characater"' input.json

Observação - os comandos perl e gawk não redefinem o contador do bloco char a cada quadro. Isto é, começa de char1 no começo e incrementa até o fim.

Entrada - sua amostra é repetida três vezes.

Resultado

8
1   97
5   89
4   97
5   97
1   77
B   97
B   94
L   34
8
1   97
5   89
4   97
5   97
1   77
B   97
B   94
L   34
8
1   97
5   89
4   97
5   97
1   77
B   97
B   94
L   34
    
por 14.07.2018 / 00:59