2016-05-04 11 views
0

bashとjqの初心者として、jshコマンドからbashスクリプトでいくつかのURLをダウンロードしようとしていました。jqを使用した複数のjsonキーの選択

マイ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スクリプトですjqフィルタのsultを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 
関連する問題