jqのフィルタのサンプルコード

jqの使い方を覚えるために実際サンプルコードを書いてみる。

[オフィシャルマニュアル](https://stedolan.github.io/jq/manual/)とちょっと表記が違うので注意。(各フィルタタイトルに「.」をつけてない。)

# フィルタ別のサンプルコード

## 〈入力〉.〈出力〉

標準入力、または左側のJSONをそのまま出力する（と理解している)。

例

    echo '{"john": "paul"}' | jq '.'
    {
      "john": "paul"
    }

## 〈入力〉[]〈出力〉

入力したJSONから外側の[]を外して出力する。
入力したJSONの配列から要素を取り出す。

例

    $ echo '[40,74,58]' | jq '.[]'
    40
    74
    58

入力したJSONから外側の{}を外して出力する。
入力したJSONのハッシュから要素の値を取り出す。キーは捨てる。

例

    $ echo '{ "john":{"name": "John"}, "paul":{"name": "Paul"}}' \
     | jq '.[]'
    {
      "name": "John"
    }
    {
      "name": "Paul"
    }
    
    $ echo '{ "john":{"name": "John"}, "paul":{"name": "Paul"}}' \
     | jq '.[][]'
    "John"
    "Paul"

## [〈入力〉]〈出力〉

入力した値の外側に[]をつけて出力する。
新しい配列を作り、入力した値を配列の要素とする。

例1

    $ echo '{"john": 40, "paul": 74}' | jq '[.]'
    [
      {
        "john": 40,
        "paul": 74
      }
    ]

例2

    $ echo '{"john": 40, "paul": 74}' | jq '.[]'
    40
    74

    $ echo '{"john": 40, "paul": 74}' | jq '[.[]]'
    [
      40,
      74
    ]

例3

    $ echo '[74, 58]' | jq '[40, .[], 76]'
    [
      40,
      74,
      58,
      76
    ]

## 〈入力〉["〈キー名〉"]〈出力〉

入力したJSONから指定されたキーを持つ要素の値を出力する。該当要素がなければnullを出力する。

例1

    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.["john"]'
    {
      "name": "John",
      "old": 40
    }
    
    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.["john"]["old"]'
    40

例2

    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.[]["name"]'
    "John"
    "Paul"

## 〈入力〉.〈キー名〉〈出力〉

〈入力〉["〈キー名〉"]〈出力〉と同じ。

例1

    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.john'
    {
      "name": "John",
      "old": 40
    }
    
    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.john.old'
    40

例2

    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.[].name'
    "John"
    "Paul"


## {〈入力〉}〈出力〉

入力したキー名、値の外側に{}をつけて出力する。
新しいオブジェクトを作り、入力したキー名、値を要素とする。

例

    $ echo '{"part":"Vocal"}' | jq '{"john": .[]}'
    {
      "john": "Vocal"
    }

キーと値がそれぞれ配列の場合、その要素の組み合わせ分だけオブジェクトを作成するのが面白い。

例1

    $ echo '{"names":["John","Paul"]}' | jq '{"vocal": .names[]}'
    {
      "vocal": "John"
    }
    {
      "vocal": "Paul"
    }

例2

    $ echo '{"names": ["John","Paul", "George"], \
     "parts":["Vocal","Base"]}' \
     | jq '{(.names[]): .parts[]}'
    {
      "John": "Vocal"
    }
    {
      "John": "Base"
    }
    {
      "Paul": "Vocal"
    }
    {
      "Paul": "Base"
    }
    {
      "George": "Vocal"
    }
    {
      "George": "Base"
    }

「(.names[])」の「()」は、書いておかないと展開してくれないらしい。

## 〈入力〉[〈インデックス〉]〈出力〉

入力したJSONの配列からインデックスの要素を取り出して出力する。

例

    echo '[40, 74, 58, 76]' | jq '.[0]'
    40
    
    $ echo '[40, 74, 58, 76]' | jq '.[1]'
    74
    
    $ echo '[40, 74, 58, 76]' | jq '.[2]'
    58

    $ echo '[40, 74, 58, 76]' | jq '.[3]'
    76

負の値を指定すると配列の末尾から探す。

例

    $ echo '[40, 74, 58, 76]' | jq '.[-1]'
    76
    
    $ echo '[40, 74, 58, 76]' | jq '.[-2]'
    58
    
    $ echo '[40, 74, 58, 76]' | jq '.[-3]'
    74
    
    $ echo '[40, 74, 58, 76]' | jq '.[-4]'
    40

## 〈入力〉[〈インデックス1〉:〈インデックス2〉]〈出力〉

入力したJSONの配列からインデックス1以上、インデックス2未満の要素を取り出して出力する。

例

    $ echo '[40, 74, 58, 76]' | jq '.[1:2]'
    [
      74
    ]

    $ echo '[40, 74, 58, 76]' | jq '.[1:3]'
    [
      74,
      58
    ]


インデックス1を省略すると開始インデックスが先頭になる。

例

    $ echo '[40, 74, 58, 76]' | jq '.[:1]'
    [
      40
    ]

    $ echo '[40, 74, 58, 76]' | jq '.[:2]'
    [
      40,
      74
    ]

    $ echo '[40, 74, 58, 76]' | jq '.[:3]'
    [
      40,
      74,
      58
    ]

インデックス2を省略すると終了インデックスが末尾になる。

例

    $ echo '[40, 74, 58, 76]' | jq '.[1:]'
    [
      74,
      58,
      76
    ]

    $ echo '[40, 74, 58, 76]' | jq '.[2:]'
    [
      58,
      76
    ]

インデックス1、インデックス2共に負の値をして可能。(どうなるかはめんどくさいから調べない。)


## 〈フィルタ1〉,〈フィルタ2〉

複数のフィルタの結果を連結して出力する。

例2

    echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.[].name,.[].old'
    "John"
    "Paul"
    40
    74

    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '[.[].name],[.[].old]'
    [
      "John",
      "Paul"
    ]
    [
      40,
      74
    ]

    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '[.[].name,.[].old]'
    [
      "John",
      "Paul",
      40,
      74
    ]

## 〈フィルタ1〉|〈フィルタ2〉

フィルタの結果にフィルタをかける。
フィルタ2にはフィルタ1の結果を受ける「.」が必要となる（と理解している。)
フィルタ1の結果が複数箇所必要になる時に使うっぽい。

例

    $ echo '{"john": { "name": "John", "old": 40}, \
     "paul": { "name": "Paul", "old": 74}}' \
     | jq '.[] | .["name"], .["old"]'
    "John"
    40
    "Paul"
    74