我在bash中有这些变量。
DOC='ABC=123;CDE=345;CDE=IOP'
NEWVAR='101808'
NEWVAR2='10240404'
我想把它们组合起来,在bash中创建一个json字符串。
{
"ABC": "123",
"CDE": "345",
"CDE": "IOP",
"NEWVAR": "101808",
"NEWVAR2": "10240404"
}
只有"DOC"在分号分隔的值中。NEWVAR和NEWVAR2只是简单的文本。
我能用jq做这个吗?
忽略重复的CDE
键,我们可以使用此答案将;
拆分器字符串转换为单独的值,然后使用add
创建一个对象:
$DOC | split(";") | map(split("=") | { (.[0]) : .[1] }) | add + { $NEWVAR } + { $NEWVAR2 }
何处
split(";") | map(split("=") | { (.[0]) : .[1] })
来自上面的链接add
创建了objecct+ { $NEWVAR }
将简单的NEWVAR
组合到对象+ { $NEWVAR2 }
添加NEWVAR2
--arg
:的完整命令
jq --arg DOC "$DOC" --arg NEWVAR "$NEWVAR" --arg NEWVAR2 "$NEWVAR2" '$DOC | split(";") | map(split("=") | { (.[0]) : .[1] }) | add + { $NEWVAR } + { $NEWVAR2 }' -Rn
本地机器上的示例:
$ DOC='ABC=123;CDE=345;CDE=IOP'
NEWVAR='101808'
NEWVAR2='10240404'
$
$ jq --arg DOC "$DOC" --arg NEWVAR "$NEWVAR" --arg NEWVAR2 "$NEWVAR2" '$DOC | split(";") | map(split("=") | { (.[0]) : .[1] }) | add + { $NEWVAR } + { $NEWVAR2 }' -Rn
{
"ABC": "123",
"CDE": "IOP",
"NEWVAR": "101808",
"NEWVAR2": "10240404"
}
$
DOC='ABC=123;CDE=345;CDE=IOP'
NEWVAR='101808'
NEWVAR2='10240404'
args=()
# parse $DOC and add jq --arg options to the array
while IFS='=' read -r -d ';' name value || [[ -n $name && -n $value ]]; do
args+=( --arg "$name" "$value" )
done < <(printf '%s' "$DOC")
# add the plain variables to the array
for var in NEWVAR NEWVAR2; do
args+=( --arg "$var" "${!var}" )
done
declare -p args
jq --null-input "${args[@]}" '$ARGS.named'
输出
declare -a args=([0]="--arg" [1]="ABC" [2]="123" [3]="--arg" [4]="CDE" [5]="345" [6]="--arg" [7]="CDE" [8]="IOP" [9]="--arg" [10]="NEWVAR" [11]="101808" [12]="--arg" [13]="NEWVAR2" [14]="10240404")
{
"ABC": "123",
"CDE": "345",
"NEWVAR": "101808",
"NEWVAR2": "10240404"
}
jq显然忽略了重复的--arg变量。
您不能有2个CDE密钥。
使用sed和Miller可以运行
<input.csv sed "s/'//g" |
mlr --x2n --ips = nest --explode --pairs --across-records -f DOC --nested-ps = then
unsparsify then
reshape -r "[A-Z]" -o i,v then
filter -x -S '$v==""' then
uniq -a
拥有
ABC 123
NEWVAR 101808
NEWVAR2 10240404
CDE 345
CDE IOP
然后您可以编写一个循环来创建您想要的错误JSON。
如果您想要JSON运行
<input.csv sed "s/'//g" |
mlr --x2j --ips = nest --explode --pairs --across-records -f DOC --nested-ps = then
unsparsify then
reshape -r "[A-Z]" -o i,v then
filter -x -S '$v==""' then
uniq -a then reshape -s i,v
拥有
{ "ABC": 123, "NEWVAR": 101808, "NEWVAR2": 10240404, "CDE": "IOP" }