JSONファイルの任意の場所で特定の要素の値を解析します。

JSONファイルの任意の場所で特定の要素の値を解析します。

"sid"for VALUE1(=)789069以降の値を一致させたい。
問題は、行の順序がランダムであることです。

[{"cid":"PWER","data":[{"VALUE1":0}],"sid":"789069","units":"kWm","age":586667},
{"cid":"PWER","data":[{"VALUE2":809}],"sid":"788325","units":"kWm","age":11},
{"cid":"PWER_SUB","data":[{"VALUE3":278}],"sid":"789540","units":null,"age":1},
{"cid":"PWER_SUB","data":[{"VALUE4":319}],"sid":"789093","units":null,"age":38},
{"cid":"PWER_SUB","data":[{"VALUE5":0}],"sid":"789069","units":null,"age":4}

それを一致させる方法についてのアイデアはありますか?

答え1

欠落している内容が]最後に挿入されたと仮定すると、これはJSON文書であるため、JSONパーサーを使用して構文解析する必要があります。jq

使用jq:

$ jq -r '.[] | select(.data[0].VALUE1) | .sid' data.json
789069

これにより、JSONオブジェクトの配列が取得され、配列項目の最初の要素VALUE1から呼び出されたキーを持つオブジェクトが選択されますdata。次に、sidそのオブジェクトから項目値を抽出します。

「生出力」-rのオプションです。jqこれがなければ、二重引用符で囲まれた値を受け取ります。

答え2

Grepはこのような問題を解決するための素晴らしいツールです grep -oP '"sid":"\d+"' file 。これはあなたが望むものですか?

修正する:そうではありません! ! ! (申し訳ありません:元の質問を理解できませんでした。)

2番目のバージョン:次のjsonツールを使用してくださいjson

cat a.json | json -c '"VALUE1" in this.data[0]' | json -a sid

または

cat a.json | json -c '"VALUE1" in this.data[0]' -a sid 
  • json -c predicate - フィルタエレメント(フィルタ)
  • json -a expression - すべての要素(マップ)に式を適用する

マニュアルは次の場所にあります。http://trentm.com/json/。インストールされていない場合:

install node
and sudo npm install -g json

答え3

レコード全体を一致させるには、awk次のものを使用できます。

awk '{if($0~/789069/){print $0}}' file

このコードでは、awk行に値が含まれていることを確認してから789069そのまま印刷し、他の行は無視します。

出力:

[{"cid":"PWER","data":[{"VALUE1":0}],"sid":"789069","units":"kWm","age":586667},
{"cid":"PWER_SUB","data":[{"VALUE5":0}],"sid":"789069","units":null,"age":4}

関連情報