使っています
awk -F'[":]' '$2=="id"{printf("pri,%s,",$5)}$2=="name"{printf("%s,",$5)}$2=="objectId"{printf$4}$2=="polledName"{print$5}' | sed -e 's/, /,/g'
これになった
}, {
"id" : "1",
"name" : "host1",
"objectId" : 0001,
"polledName" : "192.168.1.1"
}, {
"id" : "2",
"name" : "host2",
"objectId" : 0002,
"polledName" : "192.168.1.2"
}, {
"id" : "3",
"name" : "host3",
"objectId" : 0003,
}, {
"id" : "4",
"name" : "host4",
"objectId" : 0004,
"polledName" : "192.168.1.3"
}, {
これを入力してください
pri,1,host1,0001,192.168.1.1
pri,2,host2,0002,192.168.1.2
pri,3,host3,0003,pri,4,host4,0004,192.168.1.3
polledNameのエントリが存在しないときに現在の行に折り返すのではなく、次の行に移動するように変更する方法についてのアイデアがあります。つまり、$5 が何も返さない場合は改行を追加します。
上記のコードは、awkスクリプトがgawk -o-
読みやすく印刷されています。
awk -F'[":]' '
$2 == "id" {
printf "pri,%s,", $5
}
$2 == "name" {
printf "%s,", $5
}
$2 == "objectId" {
printf $4
}
$2 == "polledName" {
print $5
}
' | sed -e 's/, /,/g'
ベストアンサー1
誰にでもするコマンドラインからJSON操作に適したツールにアクセスしたら、次のようにフィールドを参照されたCSVデータセットに抽出できますjq
。
$ jq -r '.[] | [ "pri", .id, .name, .objectId, .polledName ] | @csv' file
"pri","1","host1",1,"192.168.1.1"
"pri","2","host2",2,"192.168.1.2"
"pri","3","host3",3,
"pri","4","host4",4,"192.168.1.3"
これは、質問に表示されるデータが最上位配列の一部であり、正しい形式であると仮定します(質問の3番目の要素に無効な末尾のコンマが含まれています)。
[
{"id":"1","name":"host1","objectId":1,"polledName":"192.168.1.1"},
{"id":"2","name":"host2","objectId":2,"polledName":"192.168.1.2"},
{"id":"3","name":"host3","objectId":3},
{"id":"4","name":"host4","objectId":4,"polledName":"192.168.1.3"}
]
引用符で囲まれた空の文字列に置き換えるには何もない欠落している.polledName
値の場合は、.polledName
式をjq
に変更します.polledName // ""
。null
キーが使用できない場合、またはその値がある場合は、値の代わりに空の文字列を使用してくださいnull
。
タブで区切られた値を取得するには、出力演算子@csv
に変更します。@tsv
これを行うためにJSON認識ツールを使用すると、JSONでエンコードされたデータではなく、デコードされた文字列を出力から取得できるという利点があります。また、埋め込まれた引用符などは自動的に正しく処理され、JSON入力が1行にあるのか、別の特別な方法でフォーマットされているのかは関係ありません。