Bash - перебирать файлы и извлекать значение JSON из соответствующих ключей в файле главного ключа

Я пытаюсь создать сценарий bash, который просматривает файл, содержащий список файлов (так что он проходит через каждый из эти файлы). Пока файлы открыты, я хочу использовать другую программу (jq) для извлечения значений из пары ключ-значение файлов JSON.Вот то, над чем я работаю до сих пор, довольно простое, чтобы я мог попытаться выяснить, где я ошибаюсь. Меня не беспокоит команда jq, у меня она работала, где я могу перебирать все файлы и вытаскивать значения одного ключа, но это оказывается чрезвычайно утомительным, потому что мне приходится вручную изменять его. для каждого ключа.

TL; DR: «master» - это файл, содержащий полный путь к каждому из файлов JSON, которые я хочу открыть. key.txt - это файл, содержащий все возможные ключи в этих файлах JSON. $ KEY - это синтаксис, с помощью которого jq выполняет поиск этого конкретного ключа в открытом файле и возвращает значение этого ключа. Я хочу открыть файл в главном списке, перебрать все возможные ключи и вернуть значения этих ключей в текстовый файл с именем list.txt.

Любая помощь будет принята с благодарностью.

#!/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
0
06.02.2017, 19:44
2 ответа

Читая опубликованный вами скрипт, я бы не подумал, что $ f назначается правильно. Кроме того, кавычки в команде jq могут вызывать проблему. Кроме того, вы пытаетесь прочитать простое слово master в цикле while, которое также может пытаться прочитать в list.txt одновременно с попыткой для добавления в list.txt внутри цикла.

#!/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

Это возьмет каждую строку из файла $ master , назначит ее переменной $ f в цикле и запустит запрос jq , добавление вывода в list.txt .

0
28.01.2020, 02:46

Прочитав то, что вы говорите, вы хотите сделать:

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

Список JSON файлов читается из $master и каждый путь назначается json_path по очереди.

Во внутреннем цикле ключи считываются из key.txt и по очереди присваиваются key. Утилита jq вызывается на $json_path с аргументом . .'$key', где $key расширен значением текущего ключа.

Весь вывод помещается в list.txt.

Возможно, необходимо провести некоторую оптимизацию внутреннего цикла. Например, нет необходимости считывать все ключи на каждой итерации внешнего цикла.


Аннотированная версия вашего скрипта:

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
1
28.01.2020, 02:46

Теги

Похожие вопросы