Я пытаюсь создать сценарий 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
Читая опубликованный вами скрипт, я бы не подумал, что $ 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
.
Прочитав то, что вы говорите, вы хотите сделать:
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