2016-05-04 3 views
0

Как новичок в bash и jq, я пытался загрузить несколько URL-адресов из json-файла с помощью команды jq в сценариях bash.Выбор нескольких json-ключей с помощью jq

Мой items.json файл выглядит следующим образом:

[ 
    {"title" : [bob], "link" :[a.b.c]}, 
    {"title" : [alice], "link" :[d.e.f]}, 
    {"title" : [carol], "link" :[]} 
] 

что я изначально делал просто фильтровать непустой ссылку и поместить их в массив, а затем загрузить массив:

#!/bin/bash 
lnk=($(jq -r '.[].link[0] | select (.!=null)' items.json)) 
for element in ${lnk[@]} 
do 
    wget $element 
done 

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

Я хочу фильтровать json-файл, но все же сохраняю название с помощью ссылки, чтобы я мог переименовать файл в команде wget. Но я не знаю, какую структуру я должен использовать здесь. Итак, как я могу сохранить заголовок в фильтре и использовать его после?

+0

Предоставленный "items.json" файл недействителен JSON. Укажите действительный ввод и ожидаемый выходной образец. –

ответ

0

Вы можете использовать это:

IFS=$'\n' read -d '' -a titles < <(jq -r '.[] | select (.link[0]!=null) | .title[0]' items.json); 
IFS=$'\n' read -d '' -a links < <(jq -r '.[] | select (.link[0]!=null) | .link[0]' items.json); 

Затем вы можете перебрать массивы "${title[@]}" & ${links[@]} ...

for i in ${!titles[@]}; do 
    wget -O "${titles[i]}" "${links[@]}" 
done 

EDIT: Легче & безопасный подход:

jq -r '.[] | select (.link[0]!=null) | @sh "wget -O \(.title[0]) \(.link[0])"' items.json | bash 
0

Здесь это сценарий bash, демонстрирующий чтение re sult фильтра jq в переменные bash.

#!/bin/bash 
jq -M -r ' 
    .[] 
    | select(.link[0]!=null) 
    | .title[0], .link[0] 
' items.json | \ 
while read -r title; read -r url; do 
    echo "$title: $url" # replace with wget command 
done 
Смежные вопросы