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

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

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

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

JSON

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

Q&A

解決済

2回答

1352閲覧

bash:テキストから各行を読み込んで、jqコマンドでJSONファイルを作成する方法

noz_awsinf_sp

総合スコア62

bash

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

JSON

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

0グッド

0クリップ

投稿2023/01/31 11:40

前提

cat test.txt

test.txt

110.0.0.1/32 210.0.0.2/32 310.0.0.3/32 410.0.0.4/32 510.0.0.5/32 610.0.0.6/32 710.0.0.7/32 810.0.0.8/32 910.0.0.9/32

#echo "[]" > abc.json
#echo $count=0
上記の変数設定後、以下のbashコマンドをワンライナーで実行。

bash

1while read line; do ¥ 2cat abc.json | jq ."[$count] |= .+ { \"ip\" : \"${line}\" }" > abc.json ;¥ 3count=`expr $count+1` ;done < test.txt

実現したいこと

以下のように、test,txtのIPを読み込んで、JSON形式に変換したいです。
上記に記載したコマンドを実行しましたが、想定通りjsonの中身がなく、中身が空欄のままです。
コマンドの内容にこだわりはないのですが、もし修正やこうしたらできるなどアドバイスあればお願いしたいです

abc.json

1[ 2 { 3 "ip": "10.0.0.1/32" 4 }, 5 { 6 "ip": "10.0.0.2/32" 7 }, 8 { 9 "ip": "10.0.0.3/32" 10 }, 11 { 12 "ip": "10.0.0.4/32" 13 }, 14 { 15 "ip": "10.0.0.5/32" 16 }, 17 { 18 "ip": "10.0.0.6/32" 19 }, 20 { 21 "ip": "10.0.0.7/32" 22 }, 23 { 24 "ip": "10.0.0.8/32" 25 }, 26 { 27 "ip": "10.0.0.9/32" 28 } 29]

発生している問題・エラーメッセージ

なし
※コマンド実行後は abc.jsonを見ても中身が空欄になってる

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

エラーになる原因は別回答のとおりです。
エラーを回避するには、書き出すファイルを abc.jsonでないものにすればいいでしょう。

そこを越えたとしても、 ループの中で > xyz.json としてしまうと毎回上書きになるので,>> xyz.jsonとして、追記するようにしなければなりません。

見ていたらおもしろそうだったので、作ってみました。 方針はかなり違います。

bash

1 (echo "["; arr=();while read line ; do arr+=("{ \"ip\": \"$line\" }") ; done < test.txt; echo $(IFS=, ;echo "${arr[*]}"); echo "]") | jq> abc.json

投稿2023/01/31 12:56

TakaiY

総合スコア12666

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

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

0

ベストアンサー

コマンド実行後は abc.jsonを見ても中身が空欄になってる

cat abc.json | jq ."[$count] |= .+ { \"ip\" : \"${line}\" }" > abc.json

で、catjqのコマンド実行前にリダイレクトの機能でabc.jsonのファイルを上書きオープンするのでこの時点で空になり、その後にcatjqの実行が始まります。
一旦は別のファイルに書き出して、その後にリネームするのが普通です。

投稿2023/01/31 11:52

otn

総合スコア84423

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

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

noz_awsinf_sp

2023/01/31 12:32

while read line; do cat abc.json | jq ."[$count] |= .+ { \"ip\" : \"${line}\" }" > abcd.json ; count=`expr $count + 1` ;done < test.txt 別ファイルに書き出すと、最後以外はnullになるのですが、これはまた別の考慮が必要でしょうか cat abcd.json [ null, null, null, null, null, null, null, null, { "ip": "10.0.0.9/32" } ]
otn

2023/01/31 12:51

abcd.json を abc.json にリネームしてないからでは?
noz_awsinf_sp

2023/01/31 13:01

ありがとうござます。ループ中にリネームでいけそうでした! while read line; do cat abc.json | jq ."[$count] |= .+ { \"ip\" : \"${line}\" }" > abcd.json ; cat abcd.json | jq . > abc.json ; count=`expr $count + 1` ;done < test.txt ``` [ { "ip": "10.0.0.1/32" }, { "ip": "10.0.0.2/32" }, { "ip": "10.0.0.3/32" }, { "ip": "10.0.0.4/32" }, { "ip": "10.0.0.5/32" }, { "ip": "10.0.0.6/32" }, { "ip": "10.0.0.7/32" }, { "ip": "10.0.0.8/32" }, { "ip": "10.0.0.9/32" } ] ```
TakaiY

2023/01/31 13:01

別の回答に書きましたが、これは、式の中で 「>abc.json」としているため、最後の結果しか残っていないからです。
otn

2023/01/31 13:17

リネームすれば良いので、単に mv abcd.json abc.json で良いかと思います。 コンパクトにやるには、 < test.txt sed 's/.*/{"ip": "&"}/' | jq -s . >abc.json jq -s で複数JSONを1つの配列JSONに出来ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問