在 bash 中使用 jq 更改 json
changing the json using jq in bash
我有以下json
{
"name" : "qwerty",
"values" :[
{
"field1" : [
"val1"
],
"field2" : [
"val2"
],
"name1" : [["a", "b"], ["c", "d"]]
},
{
"field1" : [
"val3"
],
"field2" : [
"val4"
],
"name1" : [["a", "b"], ["c", "d"]]
},
{
"field1" : [
"val5"
],
"field2" : [
"val6"
],
"name1" : [["a", "b"], ["c", "d"]]
}
]
}
我需要在 bash
中使用 jq 将上面的 json 更改为以下内容
{
"name" : "qwerty",
"values" :[
{
"field1" : "val1",
"field2" : "val2",
"new_name" : [["a", "b"], ["c", "d"]]
},
{
"field1" : "val3",
"field2" : "val4",
"new_name" : [["a", "b"], ["c", "d"]]
},
{
"field1" : "val5",
"field2" : "val6",
"new_name" : [["a", "b"], ["c", "d"]]
}
]
}
这里我面临以下问题:
我尝试用标记值解析内部 json 并将 '[' ']' 替换为空格,但是,当我尝试将 "values" 以以下形式放入变量中时列表,jq 是美化然后将每个新行显示为数组的元素。
values数组中内部json个数不固定。
有人可以帮我将 jq 语句设置为 bash 中的 运行 以进行所需的更改吗?
下面的代码片段应该可以满足您的要求:
jq '{
"name": .name,
"values": [
{
"field1" : .values[0].field1[0],
"field2" : .values[0].field2[0],
"New_name": .values[0].name1
},
{
"field1" : .values[1].field1[0],
"field2" : .values[1].field2[0],
"new_name" : .values[1].name1
},
{
"field1" : .values[2].field1[0],
"field2" : .values[2].field2[0],
"new_name" : .values[2].name1
}
]
}' < /tmp/input.json
编辑
由于对象的数量不固定,下面的代码片段就可以了:
jq '{
"name" : .name,
"values" : [
.values[] as $in |
{
"field1" : $in.field1[0],
"field2" : $in.field2[0],
"new_name" : $in.name1
}
]
}' < /tmp/input.json
这应该可行;我不确定是否有办法重构 field1
和 field2
:
的分配
jq '.values[] |= (.field1=.field1[0] | .field2=.field2[0])' tmp1.json
这是另一个解决方案。
.values |= map({
field1: .field1[0],
field2: .field2[0],
new_name: .name1
})
我有以下json
{
"name" : "qwerty",
"values" :[
{
"field1" : [
"val1"
],
"field2" : [
"val2"
],
"name1" : [["a", "b"], ["c", "d"]]
},
{
"field1" : [
"val3"
],
"field2" : [
"val4"
],
"name1" : [["a", "b"], ["c", "d"]]
},
{
"field1" : [
"val5"
],
"field2" : [
"val6"
],
"name1" : [["a", "b"], ["c", "d"]]
}
]
}
我需要在 bash
中使用 jq 将上面的 json 更改为以下内容{
"name" : "qwerty",
"values" :[
{
"field1" : "val1",
"field2" : "val2",
"new_name" : [["a", "b"], ["c", "d"]]
},
{
"field1" : "val3",
"field2" : "val4",
"new_name" : [["a", "b"], ["c", "d"]]
},
{
"field1" : "val5",
"field2" : "val6",
"new_name" : [["a", "b"], ["c", "d"]]
}
]
}
这里我面临以下问题:
我尝试用标记值解析内部 json 并将 '[' ']' 替换为空格,但是,当我尝试将 "values" 以以下形式放入变量中时列表,jq 是美化然后将每个新行显示为数组的元素。
values数组中内部json个数不固定。
有人可以帮我将 jq 语句设置为 bash 中的 运行 以进行所需的更改吗?
下面的代码片段应该可以满足您的要求:
jq '{
"name": .name,
"values": [
{
"field1" : .values[0].field1[0],
"field2" : .values[0].field2[0],
"New_name": .values[0].name1
},
{
"field1" : .values[1].field1[0],
"field2" : .values[1].field2[0],
"new_name" : .values[1].name1
},
{
"field1" : .values[2].field1[0],
"field2" : .values[2].field2[0],
"new_name" : .values[2].name1
}
]
}' < /tmp/input.json
编辑
由于对象的数量不固定,下面的代码片段就可以了:
jq '{
"name" : .name,
"values" : [
.values[] as $in |
{
"field1" : $in.field1[0],
"field2" : $in.field2[0],
"new_name" : $in.name1
}
]
}' < /tmp/input.json
这应该可行;我不确定是否有办法重构 field1
和 field2
:
jq '.values[] |= (.field1=.field1[0] | .field2=.field2[0])' tmp1.json
这是另一个解决方案。
.values |= map({
field1: .field1[0],
field2: .field2[0],
new_name: .name1
})