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

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

新規登録して質問してみよう
ただいま回答率
85.49%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

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

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

2回答

474閲覧

リストからJSONを生成したい

kawauso7_c

総合スコア9

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

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

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2020/07/30 00:30

前提・実現したいこと

以下のような中間結果があります。

bash

1$ cmd1 | cmd2 | cmd3 2file1 3file2

上の出力をさらにmapして最終的に以下のようなJSONを標準出力したいです。

json

1{"items": [ 2 { "title": "file1" }, 3 { "title": "file2" } 4]}

どういうやり方があるでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

JSONだと末尾のカンマを取らないといけないのが面倒なところですね。

sh

1$ cat sample.dat | awk 'BEGIN { print "{\"items\": ["; eol="" } { printf "%s { \"title\": \"%s\" }", eol, $0; eol=",\n" } END { print "\n]}" }'

AWK

1BEGIN { 2 print "{\"items\": ["; eol="" 3} 4{ 5 printf "%s { \"title\": \"%s\" }", eol, $0; 6 eol=",\n" 7} 8END { 9 print "\n]}" 10}
{"items": [ { "title": "file1" }, { "title": "file2" }, { "title": "file3" } ]}

投稿2020/07/30 01:35

編集2020/07/30 01:37
Daregada

総合スコア11990

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

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

kawauso7_c

2020/07/30 10:47

ありがとうございました!
guest

0

どういうやり方があるでしょうか?

何か、大喜利に発展しそうなご質問ですね。基本的に行データからJSONに変換する標準入出力を利用したフィルターとしてのプログラムで行けそうです。昔ながらのawkコマンドを使い、ワンライナーなら以下のようなものではどうでしょう。
awk 'BEGIN {printf("{\"item\": [");} {if (NR > 1) {printf(",");} printf("\n { \"title\": \"%s\" }", $0);} END {print("\n]}\n");}'

data.txtと言うファイル名のファイルにデータを入れて、試してみます。

sh

1$ cat data.txt 2file1 3file2 4file3 5file4 6 7$ cat data.txt | awk 'BEGIN {printf("{\"item\": [");} {if (NR > 1) {printf(",");} printf("\n { \"title\": \"%s\" }", $0);} END {print("\n]}\n");}' 8{"item": [ 9 { "title": "file1" }, 10 { "title": "file2" }, 11 { "title": "file3" }, 12 { "title": "file4" }, 13 { "title": "file5" } 14]}

コマンドラインオプションで指定すると読みづらいので、awkのスクリプトファイルとするならば以下のようになります。

awk

1BEGIN { 2 printf("{\"item\": ["); 3} 4{ 5 if (NR > 1) { 6 printf(","); 7 } 8 printf("\n { \"title\": \"%s\" }", $0); 9} 10 11END { 12 print("\n]}\n"); 13}

これをt1.awkと言う名前のスクリプトファイルにして、実行してみます。

sh

1$ cat data.txt | awk -f t1.awk 2{"item": [ 3 { "title": "file1" }, 4 { "title": "file2" }, 5 { "title": "file3" }, 6 { "title": "file4" }, 7 { "title": "file5" } 8]}

JSONを元からサポートしているPythonやRubyなどのプログラミング言語を使えば、より簡単で正確に扱えると思います。

投稿2020/07/30 01:15

dodox86

総合スコア9183

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

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

dodox86

2020/07/30 01:35

久しぶりにawkを使ってみたくてつい回答してしまいましたが、丸投げ案件だったかも。
kawauso7_c

2020/07/30 10:50

ありがとうございました!(丸投げ案件とは…?)
Daregada

2020/07/30 10:56

途中まででも自分でやってみろということだよ。
dodox86

2020/07/30 10:59

そうです。「どういうやり方があるでしょうか?」と、全面的に回答に依存したかたちになっていたように思うので。
Daregada

2020/07/30 11:03

たとえば、「自分で作ってみたのですが(作ったコードを提示)、これだと配列の最後のオブジェクトの末尾にも`,`が付いてしまいます。どうすればこれを付けないようにできますか?」とかなら、何の問題もなかったと思います。
kawauso7_c

2020/07/30 12:29

質問に問題があったようなのですが、まだあまり納得がいっていません。 AWKや似たコマンドを知らなかった場合、途中までどうやったら良かったのでしょうか。PythonやPerl等で書き換えたらできることは知っている、等と書けばまた印象が違いましたか?
dodox86

2020/07/30 13:19

>@kawauso7_cさん > AWKや似たコマンドを知らなかった場合、途中までどうやったら良かったのでしょうか。 拙速に回答してしまった私にも非がありますね。この点は申し訳ないことをしました。すみません。 質問を読んだ方の印象にもよるので必ずしも全面的に悪いと言っている訳ではありません。事実、私もご質問に低評価はしていないし、コメントでも「丸投げ案件だった"かも"。」と書いています。"丸投げ"と指摘したことについて悪い印象を与えた嫌いはあると思いますけれども。質問の仕方、書き方もあると思いますが、「どういうやり方があるでしょうか?」と言う問いかけだけを読み、考えると、やり方を列挙する回答を求めているように見えますし、少なくとも当初は私もそう思いました。そのことに回答者側が不満があれば、「質問への追記・修正依頼」で不足分の加筆をお願いすればよかった訳ですが、今回は私の興味の先行もあってそうはしませんでした。その点はちょっと反省しています。また、過去にもほぼ丸投げと思える質問でも、技術的な興味があれば回答することはありました。最近はどうも全般的に丸投げ、要は無償での作業依頼と思える質問(こちらの質問のことではありません)が多くなったように思え、神経質になっていることもあります。丸投げ案件に対しての回答は、割りに合いません。無報酬で仕事をしているようなもので、やりがい搾取です。 一部は私の意見も含みますが、実のところ直近で考えれば、質問が回答者、閲覧者にとって興味深く、回答のし甲斐があるもので、作業依頼を感じさせない問いであれば良いのです。もう少し長い目で見れば、質問者の努力が垣間見え、それを手助けできる回答ができ、完成された質問~回答をもって後の閲覧者にとっても有益なものになり得るのであれば、それは本サイトの主旨にも合致するはずなので、それも良いのです。 抽象的な話になってしまいましたが、話を戻すと、今回のご質問でいえば「どういうやり方があるでしょうか?」と言う質問に対しては「pythonやruby,perlでこれ使ってあれ使ってやればできますよ。」くらいの回答であればバランスが取れていたのかもしれません。そうであれば「あれ?丸投げかも」と私が疑問に思うことも無かったでしょうね。
kawauso7_c

2020/07/30 22:05

お返事いただきありがとうございます。 知りたいことや既に知っていることをもう少し詳しく書いておけば誤解を生まなかったと反省しています。 dodox86 さんがおっしゃっているように、質問に問題があるなら「質問への追記・修正の依頼」機能を使えばいいし、それをしないなら後からくさすコメントをつけるのはないんじゃないかなと思います(”かも”のある無しはあまり関係ないと思います)。サイトの健全化のためにも。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問