json入力:
[
{
"name": "cust1",
"grp": [
{
"id": "46",
"name": "BA2"
},
{
"id": "36",
"name": "GA1"
},
{
"id": "47",
"name": "NA1"
},
{
"id": "37",
"name": "TR3"
},
{
"id": "38",
"name": "TS1"
}
]
}
]
予想どおり、出力には2行あります。
name: cust1
groups: BA2 GA1 NA1 TR3 TS1
私は成功せずにフィルターを構築しようとしていました。
$ jq -r '.[]|"name:", .name, "groups:", (.grp[]|[.name]|@tsv)' test_json
name:
cust1
groups:
BA2
GA1
NA1
TR3
TS1
更新:以下に提供されているソリューションは正常に機能しますが、グループが存在しない場合のケースは予測しませんでした:
[
{
"name": "cust1",
"grp": null
}
]
そのような場合、提供されたソリューションはエラーを返します:
$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json2
name: cust1
jq: error (at test_json2:6): Cannot iterate over null (null)
回避策はありがたいです。
「結合」を使用してください、-j
$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json
name: cust1
groups: BA2 GA1 NA1 TR3 TS1
そしてプレースホルダー付き
$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp//[{"name":"-"}]|.[]|" ",.name),"\n"' test_json
name: cust1
groups: -
$ jq -r '.[]|
[ "name:", .name ],
[ "groups:", .grp[].name ]
|@tsv' file.json
name: cust1
groups: BA2 GA1 NA1 TR3 TS1
つまり、@tsv
に2つの配列を与えます。1つは名前、もう1つはグループです。各配列は独自の行になります。
grp
配列が空で、代わりに-
を挿入したい場合:
$ jq -r '.[]|
[ "name:", .name ],
[ "groups:", (.grp // [])[].name // "-" ]
|@tsv' file.jsonfile.json
name: cust1
groups: -
これは、grp
が完全に欠落している場合(空の配列だけではない)も処理します。