2017-02-15 26 views
12

jsonファイルがあり、その上に新しいオブジェクト配列を追加したいと思います。私はjqコマンドラインを使用しようとしています。私はインターネットを見ていたので、このコマンドはJsonファイルのクエリオブジェクトだけでなく、これを行うことです。しかし、私はどのようにjqのADDコマンドを使用するのか分かりません。 私のJSONファイルは、レポート-2017-01-07.jsonです>>jqを使用して既存のJSON配列に新しい要素を追加

{ 
    "report":"1.0", 
    "data":{ 
     "date":"2010-01-07", 
     "messages":[ 
     { 
      "date":"2010-01-07T19:58:42.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"OK", 
      "message":"metadata loaded into iRODS successfully" 
     }, 
     { 
      "date":"2010-01-07T20:22:46.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"NOK", 
      "message":"metadata duplicated into iRODS" 
     }, 
     { 
      "date":"2010-01-07T22:11:55.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"NOK", 
      "message":"metadata was not validated by XSD schema" 
     } 
     ] 
    } 
} 

私は、以下のコマンドを使用しています>>

$ cat report-2017-01-07.json | jq -s '.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' 
jq: error: syntax error, unexpected '{', expecting $end (Unix shell quoting issues?) at <top-level>, line 1: 
.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}    
jq: 1 compile error 

私はすでに別のコマンドの組み合わせを試してみましたが、私はいつもで終わるのですエラーコンパイル。それについてのヒント? ありがとう!

出力がどのように見える必要があります>>

{ 
    "report": "1.0", 
    "data": { 
     "date": "2010-01-07", 
     "messages": [{ 
      "date": "2010-01-07T19:58:42.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "OK", 
      "message": "metadata loaded into iRODS successfully" 
     }, { 
      "date": "2010-01-07T20:22:46.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "NOK", 
      "message": "metadata duplicated into iRODS" 
     }, { 
      "date": "2010-01-07T22:11:55.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "NOK", 
      "message": "metadata was not validated by XSD schema" 
     }, { 
      "date": "2010-01-07T19:55:99.999Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "OKKKKKKK", 
      "message": "metadata loaded into iRODS successfullyyyyy" 
     }] 
    } 
} 
+0

は、このよくわからないが、それはarrrayある.data.messages問題ではないのですか?あなたは.data.messagesのようなものが必要です。[] –

+0

申し訳ありませんが、うまくいきませんでした。 –

+0

Ok - ドキュメントを読んでjqをインストールしてみました。 Windowsシェルには、ストリームに二重引用符を供給してjqを移動する方法に問題があるようです。あなたの質問には何の答えもありませんが、jqコマンドで二重引用符をエスケープすることをお勧めします。だから '' date ''は' \ "date \" 'となります。 –

答えて

15

フィルタで|= .+部分は既存のアレイに新しい要素を追加します。あなたは、ハードコードの長さの値3を使用しないようにするに

jq '.data.messages[3] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson 

としてフィルターでjqを使用して、動的に新しい要素を追加し、次の配列のインデックスとして使用することができます長さを返します. | length、すなわち

を使用することができますコメントのピークの提案どおり
jq '.data.messages[.data.messages| length] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson 

(または)、一人で+=オペレータ

jq '.data.messages += [{"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]' 
を使用して

は、必要に応じて出力を生成します。

{ 
    "report": "1.0", 
    "data": { 
    "date": "2010-01-07", 
    "messages": [ 
     { 
     "date": "2010-01-07T19:58:42.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "OK", 
     "message": "metadata loaded into iRODS successfully" 
     }, 
     { 
     "date": "2010-01-07T20:22:46.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "NOK", 
     "message": "metadata duplicated into iRODS" 
     }, 
     { 
     "date": "2010-01-07T22:11:55.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "NOK", 
     "message": "metadata was not validated by XSD schema" 
     }, 
     { 
     "date": "2010-01-07T19:55:99.999Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "OKKK", 
     "message": "metadata loaded into iRODS successfullyyyyy" 
     } 
    ] 
    } 
} 

使用jq-playあなたjq-filterを実行して、あなたが好きな方法で最適化し、乾燥します。 +=を使用することがはるかに優れて

+0

で更新されました。目標は要素を追加するだけなので、+ =を使用するほうが良いでしょうが、 '.data.messages [3] | =ということには注意してください。 + X'は '.data.messages [3] = X'に単純化することができます。これは、RHS上の' .'が事実上ちょうど 'ヌル 'であるためです。 – peak

+0

(ここではWindows JQのユーザー):後で名前を変更する必要がある一時ファイルを作成するのではなく、この新しいデータを同じ(入力)ファイルに書き込むことが可能かどうか疑問です。 –

+0

@ script'n'code - あなたがそれを持っている、またはそれをインストールできるなら、 'sponge'は恐らくはおそらく最良の選択肢です(それはmoreutilsの一部です)。 – peak

12

よりもむしろここ|=を使用して、:

.data.messages += [{"date": "2010-01-07T19:55:99.999Z", 
    "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
    "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}] 
関連する問題