2016-04-05 8 views
1

入力JSONファイルを作成するには: を私は以下の構造で、その中にIPアドレスのセットで「myseedips」と呼ばれるファイル名バッシュスクリプトは、

10.204.99.15 
10.204.99.12 
10.204.99.41 

これらは「n」をすることができを持っています1行ずつIPアドレスの数。

出力 私はbashプログラミングについて知らない。しかし、以下の構造でJSONファイルを作成するためのbashスクリプトを書く必要があります。これらのIPアドレスはループ内になければなりません。JSONはmyseedipsファイルの長さに応じて変更/拡張されます。

"cassandra": { 
     "nodes": [ 
     {"ip_address": "10.204.99.15","type": "seed"}, 
     {"ip_address": "10.204.99.12","type": "seed"}, 
     {"ip_address": "10.204.99.41","type": "seed"}] 
    }, 

はまた最後を除くすべてのノードの各ノードの最後にカンマを追加するロジックを追加する必要があります。ノードが1つしかない場合は、カンマを付加しないでください。

例: 以下のコードロジックのようになりますが、bashプログラミングの可能性があります。

j string 
j = `"cassandra": {"nodes": [` 
for i =0;i<len(ips);i++ { 
    j = j + `{"ip_address": "` + ips[i] + `","type": "seed"},` 
} 
j = j + `}]}` 

救助のおかげ Nissarシェイク

答えて

1

jq使用して、実行可能な配列が、シンプルに生のテキストから変換するために、余分なパスが必要になります:

$ jq -R '.' myseedips | jq -s '{cassandra:{nodes:map({ip_address:.,type:"seed"})}}' 

これが得以下:ジェフの答えにさらに

{ 
    "cassandra": { 
    "nodes": [ 
     { 
     "ip_address": "10.204.99.15", 
     "type": "seed" 
     }, 
     { 
     "ip_address": "10.204.99.12", 
     "type": "seed" 
     }, 
     { 
     "ip_address": "10.204.99.41", 
     "type": "seed" 
     } 
    ] 
    } 
} 
+0

あなたJQはinputsフィルタを持っている場合。これはうまくいった。お返事ありがとうございます – Nissar

+0

ジェフ、このループに投稿されたもう1つの質問にお答えしますか – Nissar

0

awk

テンプレートawkソリューションを使用すると、ヘッダー、フッター、プレフィックス、およびサフィックスを置き換えることができます

$ awk 'BEGIN{print "header"} 
    NR==FNR{c=NR;next} 
      {print "prefix",$1,"suffix" (FNR<c?",":"]")} 
     END{print "footer"}' myseedips{,} 

header 
prefix 10.204.99.15 suffix, 
prefix 10.204.99.12 suffix, 
prefix 10.204.99.41 suffix] 
footer 

することができます。

0

、変換はjqの1回の呼び出しで行うことができます。

jq -Rn '[inputs] | {cassandra:{nodes:map({ip_address:.,type:"seed"})}}' 

そうでない場合:優れた答えジェフ・タント

jq -Rs 'split("\n") | {cassandra:{nodes:map({ip_address:.,type:"seed"})}}' ips.txt 
関連する問題