Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多个键值对转换为JSON格式:如何在awk的for循环中使用sed_Json_Bash_Awk_Sed - Fatal编程技术网

将多个键值对转换为JSON格式:如何在awk的for循环中使用sed

将多个键值对转换为JSON格式:如何在awk的for循环中使用sed,json,bash,awk,sed,Json,Bash,Awk,Sed,我有一个数据文件,它是由8列分隔的管道,最后一列是一个不可预测的键值对,这些键值对之间用=符号关联,每个键值对之间用空格分隔。不幸的是,每个键值对中的值也可能包含一个空格 以下是输入数据文件中一条记录的示例: Val1|Val2|Val3|Val4|Val5|Val6|Val7| key1=70 key2=11\=12 key3=Some other value key4=Another value 以下是我需要将其发送到的最终输出(在第8列中以JSON格式显示所有键值对): 这是一个可以让数

我有一个数据文件,它是由8列分隔的管道,最后一列是一个不可预测的键值对,这些键值对之间用=符号关联,每个键值对之间用空格分隔。不幸的是,每个键值对中的值也可能包含一个空格

以下是输入数据文件中一条记录的示例:

Val1|Val2|Val3|Val4|Val5|Val6|Val7| key1=70 key2=11\=12 key3=Some other value key4=Another value
以下是我需要将其发送到的最终输出(在第8列中以JSON格式显示所有键值对):

这是一个可以让数据看起来像什么的例子(所以我们可以考虑使用这种格式的数据,向前看,假设这个字符串包含在一个名为MyDATA变量)中:

但我缺少的是“,”,它将前一个值的结尾与下一个键名分开

此时,我需要在awk命令的循环中执行一个S&R,以便对于每次迭代,它使用双引号、逗号、空格和双引号(“,”)将上一个值(在键值对中)与下一个键名分开

我已经编写了最后一个awk命令,但是在awk的for循环中,我需要为每个迭代执行的s&R没有:

echo $mydata | awk -F '\":\"' '{ str1 = $1; for (i = 2; i <= NF; i++) str1 = str1 "\":\"" $i; print str1 }'

如果您的数据是合理规则的,即在任何
val
s中,键都只由单词字符组成,那么您应该能够使用sed完成整个操作:

sed 's/| \(\w\w*\)=/|{"\1"="/;
     s/$/"}/;
     s/ \(\w\w*\)=/" "\1"="/g'
“键”是要注意原始的“键”总是
=

测试:

$ sed 's/| \(\w\w*\)=/|{"\1"="/;s/$/"}/;s/ \(\w\w*\)=/" "\1"="/g'
Val1|Val2|Val3|Val4|Val5|Val6|Val7| key1=70 key2=11\=12 key3=Some other value key4=Another value
Val1|Val2|Val3|Val4|Val5|Val6|Val7|{"key1"="70" "key2"="11\=12" "key3"="Some other value" "key4"="Another value"}

用不使用注释的代码更新帖子。您当前有哪些代码接收输入并创建当前输出?给我们看看它是什么。我认为应该允许用这两个部分进行更新。我不明白为什么会这样。再试一次。如果你还是做不到,我可以试着把它们从你的评论中删除。杰夫·Y,这太棒了!对此解决方案印象深刻;比我想要的更优雅。我对您的解决方案做了一个小的更新,就是添加了一个逗号,这样“看起来像”,这是您的答案:sed's/|(\w\w*)=/|{“\1”=”/;s/$/”};s/(\w\w*)=/“\1”=”/g'以下是我必须更改的内容:sed的s/|(\w\w*)=/|{“\1”=”/;s/$/”}/;s/(\w\w*)=/“,“\1”=“/g”你刚刚帮我省去了很多挫折和浪费的时间。谢谢不客气。我的座右铭是,数据允许时,始终保持简单。
test="Val1|Val2|Val3|Val4|Val5|Val6|Val7| key1=70 key2=11\=12 key3=Some other value key4=Another value";

echo $test | awk -F '|' '{print $1 "|" $2 "\x1c" $3 "|" $4 "|" $5 "|" $6 "|" $7 "|" "{\"" $8 "\"}" }' \
| sed -e 's/{\" /{\"/g' -e 's/\\=/\x07/g' -e 's/[[:space:]]*=/\":\"/g' -e 's/\x07/\\=/g' 
sed 's/| \(\w\w*\)=/|{"\1"="/;
     s/$/"}/;
     s/ \(\w\w*\)=/" "\1"="/g'
$ sed 's/| \(\w\w*\)=/|{"\1"="/;s/$/"}/;s/ \(\w\w*\)=/" "\1"="/g'
Val1|Val2|Val3|Val4|Val5|Val6|Val7| key1=70 key2=11\=12 key3=Some other value key4=Another value
Val1|Val2|Val3|Val4|Val5|Val6|Val7|{"key1"="70" "key2"="11\=12" "key3"="Some other value" "key4"="Another value"}