[jq] アウトプットをkey-value形式の連想配列で出力する方法

2019年4月7日

jq テクノロジー プログラミング

ログファイルやデータファイルからレコードデータを複数取得して、それを配列で返すのは非常に簡単にできますが、これを任意のデータをkeyにして、連想配列で出力するという複雑な処理をやってみたいと思います。

どんな時に使うの?

商品IDと商品詳細が追記されていくようなレコードタイプのログで、そのデータから商品IDをkeyとした、データを取得したい場合などで、レコード型データを簡単にHASHデータとして取得が出来るようになります。 その後、JavascriptのAjaxで取得した場合は、即座にJSON.parse()すればいいし、PHPの場合であれば、json_decode()してしまえば、テキストレコードデータからのHASH取得が簡単に行えるようになります。

from_entriesを使って連想配列化

jqは様々な命令機能を持っているため、リファレンスページを熟読してみると、色々な発見があり、非常に高機能なツールであることが分かります。 https://stedolan.github.io/jq/manual/ ここに記述されている「from_entries」でkey-value出力ができるという内容が書かれています。 サンプルで登録されているコードは以下のとおりです。 jq 'from_entries' Input [{"key":"a", "value":1}, {"key":"b", "value":2}] Output {"a": 1, "b": 2}

サンプルデータを使って実践

{"id":"001","name":"リンゴ"} {"id":"002","name":"バナナ"} {"id":"003","name":"オレンジ"} {"id":"004","name":"キウイ"} {"id":"005","name":"マンゴー"} jq --slurp '[ .[] | {key:.id , value:.name} ] | from_entries' data.json { "001": "リンゴ", "002": "バナナ", "003": "オレンジ", "004": "キウイ", "005": "マンゴー" } かなりシンプルなデータ構造でやったので、簡単に見えるかもしれませんが、key-valueの配列データを出力して"from_entries"でhash化するという内容になっています。 valueの値に色々なデータを入れたり、内部をさらに配列や連想配列にすることもできるので、応用パターンは無限大ですね。 配列で受け取ることが多いjqコマンドですが、連想配列も慣れると簡単に取得できて、key検索などが非常に高速に行なうことが可能になります。 jq使いこなすともはやSQLは不要なのではないかとすら感じるようになってきましたね・・・いいのかな?

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。