2016-09-28 2 views
2

を使用してJSONオブジェクトを介して:私は他のコマンドでOutputKeyとOutputValueの値を使用できるようにループこれは、オブジェクトの私のJSON配列は次のようになりますJQ

[ 
    { 
     "Description": "Description 1", 
     "OutputKey": "OutputKey 1", 
     "OutputValue": "OutputValue 1" 
    }, 
    { 
     "Description": "Description 2", 
     "OutputKey": "OutputKey 2", 
     "OutputValue": "OutputValue 2" 
    }, 
    { 
     "Description": "Description 3", 
     "OutputKey": "OutputKey 3", 
     "OutputValue": "OutputValue 3" 
    }, 
    { 
     "Description": "Description 4", 
     "OutputKey": "OutputKey 4", 
     "OutputValue": "OutputValue 4" 
    }, 
    { 
     "Description": "Description 5", 
     "OutputKey": "OutputKey 5", 
     "OutputValue": "OutputValue 5" 
    }, 
    { 
     "Description": "Description 6", 
     "OutputKey": "OutputKey 6", 
     "OutputValue": "OutputValue 6" 
    } 
] 

がどのように私はこの使用JQを反復処理するのですか?

+0

@tripleeeは、そのほかの質問に受け入れ答えの著者として、私は別に、このいずれかを答えることにしましたここでは特に役立つ/適用可能である - それは誤ってやっていたOPの「雑草の中で」余りにも多くの時間を費やし、一般的かつ適用可能な良いプラクティスを提供するには不十分である。実際には、OPはすでにjqを知っており、厳密にはbashの終わりに焦点を当てていると仮定しています。実際にアレイ全体を反復する方法についてのガイダンスはありません。 –

+0

@ tripleee、...正直言って、あるものをもう一方の複製としてクローズする余地があるなら、私は、この答えを他の人に役立つ可能性が高いので、 (そしてここでの質問は、そのような答えに役立つ方法で、事前の実施なしでは指導/訂正が必要です)。 –

+0

@ tripleee、...私は他の質問を更新して、そのタイトル(特に特に一般化できないもの)をよりよく反映させるようにしました。 –

答えて

6

は、あなたのコンテンツがin.jsonから来ていると仮定すると:あなたの入力を考えると、これはstderrに以下の発する

#!/usr/bin/env bash 
case $BASH_VERSION in (""|[123].*) echo "Bash 4.0 or newer required" >&2; exit 1;; esac 

declare -A values=() descriptions=() 

while IFS= read -r description && 
     IFS= read -r key && 
     IFS= read -r value; do 
    values[$key]=$value 
    descriptions[$key]=$description 
    echo "Read key $key, with value $value and description $description" >&2 
done < <(jq -r '.[] | (.Description, .OutputKey, .OutputValue)' <in.json) 

Read key OutputKey 1, with value OutputValue 1 and description Description 1 
Read key OutputKey 2, with value OutputValue 2 and description Description 2 
Read key OutputKey 3, with value OutputValue 3 and description Description 3 
Read key OutputKey 4, with value OutputValue 4 and description Description 4 
Read key OutputKey 5, with value OutputValue 5 and description Description 5 
Read key OutputKey 6, with value OutputValue 6 and description Description 6 

また、このコードが実行された後、あなたができます

key_to_look_up="OutputKey 1" 
echo "${values[$key_to_look_up]}" 
echo "${descriptions[$key_to_look_up]}" 

...と出力として得る:その答えを再読、私はそれがあったとは思いませんでしたので、

OutputValue 1 
Description 1 
+1

「。[] | [.Description、.OutputKey、.OutputValue] | 。[] 'は次のように簡略化することができます。 (.Description、.OutputKey、.OutputValue) 'となり、この特定の場合には括弧も削除されます。 – peak

+0

良い点、ありがとう!私は括弧が明瞭さを加えていると思いますので、私はそれらを残しておきますが、あなたは実際にjqのモデルを少し良く理解する助けになりました。 –

+0

(不要な中間配列を取り除くことは、すべての面で改善されています - 読みやすさと処理オーバーヘッドの両方が、もう一度ありがとう)。 –

1
  1. あなたの質問はあまり明確ではありません。 jq以外のツールやアプリケーションが消費する値を生成したい場合は、そのツールが期待していることを知っておくと便利です。 jq自体の値を使用する場合は、mapまたはreduceを使用できます。代わりに、または[.[] ...]という形式のフィルタを使用できます。...は、対象の値にアクセスするjqコードです(例:

    [.[] | [.OutputKey, .OutputValue] ] 
    
  2. あなたには、いくつかの縮小操作を実行したい場合、あなたはおそらくフォームを使用したいと思うでしょう:reduce .[] as $x (_; _)

  3. それはあなたがやろうとしているが何であるかに応じて、他の選択肢があります。

+0

私はJSONを修正しました。この配列のforループを実行しようとしていて、forループで呼び出す他の関数に渡すことができる値を取得しようとしています。私が得ようとしている値は、OutputKeyを使うことです。 – Asdfg

関連する問題