Bash - percorre os arquivos e extrai o valor JSON das chaves correspondentes em um arquivo de chave mestra

0

Eu estou tentando fazer um script bash que percorre um arquivo que contém uma lista de arquivos (assim ele passa por cada um desses arquivos). Enquanto os arquivos estão abertos, quero usar outro programa (jq) para extrair os valores do par de valores-chave dos arquivos JSON. Aqui está o que eu estou trabalhando até agora, mantido bem básico para que eu possa tentar descobrir onde estou indo errado. Eu não estou preocupado com o comando jq, eu tive ele trabalhando onde eu sou capaz de percorrer todos os arquivos e extrair os valores de uma única chave, mas isso acaba sendo extremamente tedioso porque eu tenho que alterá-lo manualmente para cada chave.

TL; DR: 'master' é o arquivo que contém o caminho completo de cada um dos arquivos JSON que eu quero abrir. 'key.txt' é um arquivo que contém todas as chaves possíveis dentro desses arquivos JSON. $ KEY é a sintaxe para o jq pesquisar o arquivo aberto por essa chave específica e retornar o valor dessa chave. Eu quero abrir um arquivo na lista principal, percorrer todas as chaves possíveis e retornar os valores dessas chaves em um arquivo de texto chamado 'list.txt'.

Qualquer ajuda seria muito apreciada.

#!/bin/bash

master="path/masterlist.txt"
while read master
do
        for KEY in 'key.txt'
        do
                jq '. .'$KEY'' $f
                echo $KEY
        done >> list.txt
        echo $master
done < list.txt
    
por user131935 06.02.2017 / 18:44

2 respostas

1

Depois de ler o que você diz que quer fazer:

master="path/masterlist.txt"

while read json_path; do
    while read key; do
        printf 'File="%s", Key="%s"\n' "$json_path" "$key"
        jq ". .'$key'" "$json_path"
    done <key.txt
done <"$master" >list.txt

A lista de arquivos JSON é lida de $master e cada caminho é atribuído a json_path por vez.

No loop interno, as chaves são lidas de key.txt e atribuídas a key por sua vez. O utilitário jq é chamado em $json_path com o argumento . .'$key' , em que $key é expandido com o valor da chave atual.

Toda saída é colocada em list.txt .

Pode haver alguma otimização a ser feita com o loop interno. Parece desnecessário ler todas as chaves em cada iteração do loop externo, por exemplo.

Versão anotada do seu script:

master="path/masterlist.txt"        # this is never used
while read master                   # this will set $master to something from list.txt
do
        for KEY in 'key.txt'        # $KEY will be the string 'key.txt' (nothing else)
        do
                jq '. .'$KEY'' $f   # $f is empty
                echo $KEY
        done >> list.txt            # better to >list.txt after "done" of outer loop
        echo $master
done < list.txt                     # you probably don't want to read from this file
    
por 06.02.2017 / 19:46
0

Ao ler o script que você postou, eu não acho que $f esteja sendo atribuído corretamente. Além disso, a cotação no comando jq pode estar causando um problema. E, em seguida, há o fato de que você está tentando ler uma palavra nua master em um loop while, que também pode estar tentando ler em list.txt ao mesmo tempo em que está tentando anexar list.txt dentro do loop .

#!/bin/bash

master="path/masterlist.txt"

cat $master | while read f; do
    for KEY in 'key.txt'; do
        echo $(jq ". .'$KEY'" $f) >> list.txt
    done
    echo $master
done

Isso levará cada linha do arquivo $master e atribuirá isso à variável $f no loop e executará a consulta jq , anexando a saída a list.txt .

    
por 06.02.2017 / 19:19