質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

1310閲覧

キーと値のペアを1行ずつ出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/06/05 18:46

シェルスクリプトに、以下のような変数dataがあります。

#!/bin/bash data="[{\"id\": \"A101\", \"name\": [\"aaa\", \"bbb\", \"ccc\"]}, {\"id\": \"B202\", \"name\": [\"aaa\", \"bbb\"]}]"

上記の変数dataの中身を整形して、キーと値のペア毎に1行ずつ標準出力したいと考えています。

"id": "A101" "name": ["aaa", "bbb", "ccc"] "id": "B202" "name": ["aaa", "bbb"]

このような出力をしたい場合、シェルスクリプトにはどのように記述すると良いのでしょうか?
「dataに入っている値は出力するとJSON形式となるのでjqコマンドが使えるのでは…」
「for文でループする方法があるのでは…」
と浮かんではいるのですが、具体的な形にはできませんでした…。
ご教授いただけますと幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

拝見いたしました。
jqを使ったご回答はございますので、基本的なシェルコマンドで行いました。

sh

1echo $data | 2sed "s/id/\nid/g" | 3sed "s/\"name/\nname/g" | 4cut -d "}" -f 1 | 5sed "s/, *$//g" | 6grep -e "id" -e "name"

ご参考になれば幸いです。

投稿2020/06/06 22:10

t-taro

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/08 15:42

大変参考になりました! ありがとうございます!
guest

0

このような場合、プログラミング言語系のコマンドで処理するのがすっきりすると思いますが、例えば jq と awk を使ってこんなのはどうでしょうか。

echo $data | jq . | awk ' /^[/ || /^]/ || /{/ || /}/ {next} /id/ {print $1,substr($2,1,length($2)-1); next} /name/ {s = $1 " ["; next} / ]/ {print s "]"; next} {s = s $1}'

投稿2020/06/05 23:33

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/08 15:44

大変参考になりました! ありがとうございます!
guest

0

ベストアンサー

コード拝見しました。
以下のスクリプトで要件を満たすように思います。echoの引数部分は$dataに置き換えていただくと良いかと存じます。

bash

1echo '[{"id": "A101", "name": ["aaa", "bbb", "ccc"]}, {"id": "B202", "name": ["aaa", "bbb"]}]' | 2jq -c '.[]' | 3sed -E "s/,(.*[)/$(printf '\\012 ')\1/g" | 4sed "s/[\{\}\s ]//g"

このスクリプトで、以下の出力を得ました。

output

1"id":"A101" 2"name":["aaa","bbb","ccc"] 3"id":"B202" 4"name":["aaa","bbb"]

jqコマンドで処理したのちに、sedで{},の除去と改行を行なっています。
また、パースするjsonによっては、sed部分を書き換えていただく必要があるかと存じます。

投稿2020/06/05 20:50

ToyoshimaHi

総合スコア130

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/08 15:43

大変参考になりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問