jq:通过从 object/embedded 数组中有选择地选择值来形成 CSV
jq: Forming CSV by selectively choosing values from object/embedded array
输入为:
{"1.2.3.4":[{"Value":"myval1","Key":"mykey1"}, {"Value":"myval3","Key":"mykey3"},{"Value":"myval2","Key":"mykey2"},{"Value":"myval4","Key":"mykey4"}]}
{"4.5.6.7":[{"Value":"myval1","Key":"mykey1"}, {"Value":"myval3","Key":"mykey3"},{"Value":"myval2","Key":"mykey2"},{"Value":"myval4","Key":"mykey4"}]}
我想得到的是:
"1.2.3.4,myval1,myval3"
"4.5.6.7,myval1,myval3"
基本上提取第一个字段,然后从嵌入值字段中提取 "mykey1" 和 "mykey2" 的值。
编辑:
我尝试过的:
我可以通过执行以下操作来提取值:
jq -c '."1.2.3.4" | .[]' | jq -s 'from_entries | [.mykey1, .mykey2] | join(",")'
我想包括我的对象名称,而且我的对象名称各不相同,所以我不能真正按硬编码值进行过滤
你可以这样做:
$ jq -r --argjson cols '["mykey1","mykey2"]' '[to_entries[] | .key, (.value | from_entries[$cols[]])] | @csv' input.json
将对象转换为条目列表是访问过滤器对象中的键和值的简单方法。
这是另一个概括了 Surki 方法的解决方案:
keys[] as $k
| .[$k]
| from_entries
| [$k, .mykey1, .mykey2]
| join(",")
输入为:
{"1.2.3.4":[{"Value":"myval1","Key":"mykey1"}, {"Value":"myval3","Key":"mykey3"},{"Value":"myval2","Key":"mykey2"},{"Value":"myval4","Key":"mykey4"}]}
{"4.5.6.7":[{"Value":"myval1","Key":"mykey1"}, {"Value":"myval3","Key":"mykey3"},{"Value":"myval2","Key":"mykey2"},{"Value":"myval4","Key":"mykey4"}]}
我想得到的是:
"1.2.3.4,myval1,myval3"
"4.5.6.7,myval1,myval3"
基本上提取第一个字段,然后从嵌入值字段中提取 "mykey1" 和 "mykey2" 的值。
编辑:
我尝试过的:
我可以通过执行以下操作来提取值:
jq -c '."1.2.3.4" | .[]' | jq -s 'from_entries | [.mykey1, .mykey2] | join(",")'
我想包括我的对象名称,而且我的对象名称各不相同,所以我不能真正按硬编码值进行过滤
你可以这样做:
$ jq -r --argjson cols '["mykey1","mykey2"]' '[to_entries[] | .key, (.value | from_entries[$cols[]])] | @csv' input.json
将对象转换为条目列表是访问过滤器对象中的键和值的简单方法。
这是另一个概括了 Surki 方法的解决方案:
keys[] as $k
| .[$k]
| from_entries
| [$k, .mykey1, .mykey2]
| join(",")