如何将分号分隔的参数转换为json



我在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" }

相关内容

  • 没有找到相关文章

最新更新