70083


AWS CLI で特定の名前のついたサブネットIDを `,` 繋ぎで出力したいです

* * *

セキュリティの関係で AWS CLI の結果を載せるわけにいかないので以下のようなサンプルを使います

[code]

    [{"name":"ab","id":"1"},{"name":"bc","id":"2"},{"name":"cd","id":"3"}]
    
[/code]

例えば上のようなJSONから name に b が含まれるものの id を `,` 繋ぎで  
`1,2` という出力を得たいです

select までは

[code]

    echo '[{"name":"ab","id":"1"},{"name":"bc","id":"2"},{"name":"cd","id":"3"}]' | jq '.[] | select(.name | contains("b")) | .id'
    
[/code]

でできたのですが

最後の `,` で繋ぐ join がうまくいきません

[code]

    echo '[{"name":"ab","id":"1"},{"name":"bc","id":"2"},{"name":"cd","id":"3"}]' | jq '.[] | select(.name | contains("b")) | .id | join(",")'
    
[/code]

と書いても

[code]

    jq: error (at <stdin>:1): Cannot iterate over string ("1")
    
[/code]

というエラーになってしまいます

join はどう使えばいいのでしょうか


CC BY-SA 4.0
2020-09-02T10:13:47.047
70081
2020-09-03T05:04:25.120
2020-09-03T05:04:25.120
3060
question
jq
jq コマンドで特定の条件のJSONエントリを取得して、その中のキーを , 繋ぎで出力したい


[こちらの回答](https://stackoverflow.com/a/49302719)が参考になるでしょう。

[code]

    $ echo '[{"name":"ab","id":"1"},{"name":"bc","id":"2"},{"name":"cd","id":"3"}]' |
      jq -r 'map(select(.name|contains("b"))|.id)|join(",")'
    
    1,2
    
[/code]


CC BY-SA 4.0
2020-09-02T11:18:50.750
70083
2020-09-02T11:18:50.750
70081
answer


質問は`jq`ですが、その入力データがAWS CLIで作られているとのことですので、参考までに。

AWS
CLIは[`--query`オプションで出力内容を編集](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-
usage-output.html#cli-usage-output-
filter)することができます。また[`--output`オプションで出力形式も変更](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-
usage-output.html#cli-usage-output-format)できます。

AWS CLIが仮に

[code]

    [{"name":"ab","id":"1"},{"name":"bc","id":"2"},{"name":"cd","id":"3"}]
    
[/code]

を出力する状況で、`1,2`を得たいのであれば、

[code]

    aws hogehoge --output text --query 'join(`,`,[?contains(name,`b`)].id)'
    
[/code]

で実現できます。


CC BY-SA 4.0
2020-09-03T04:56:43.070
70101
2020-09-03T04:56:43.070
4236
70081
answer