文件中的日期看起来像
test,test
test1,test1
我想将其转换为:
{"test":"test","test1":"test1"}
我为此目的尝试过jq jq -R -s -c 'split("\n")'
但其输出格式为["test,test","test1,test1",""]
答案 0 :(得分:1)
jq 1.5具有inputs
,它提供了一种简单而有效的解决方案:
jq -R -n -c '[inputs|split(",")|{(.[0]):.[1]}] | add' input.txt
重要提示:请不要忘记-n
选项,否则您将丢失第一行。
如果您的jq没有inputs
,那么该尽可能升级了。否则:
jq -R -s '
split("\n")
| map(if index(",") then split(",")|{(.[0]):.[1]}
else empty end)
| add' input.txt
答案 1 :(得分:1)
如@peak所示,将inputs
与split
函数一起使用。但是要将键/值合并到一个对象中,请使用reduce
方法:
jq -Rn '[inputs|split(",")| {(.[0]): .[1]}] | reduce .[] as $obj ({}; . + $obj) ' input.csv
reduce
方法将数组中的每个项目都简化为一个项目。在这种情况下,我们指示应将每个项目分配给$obj
变量,并从空的{}
对象开始。 reduce
方法的第二个参数指示如何将事物“简化”为单个项目。在这种情况下,我们将添加/合并分配给我们开始使用的$obj
对象的{}
,然后返回要在下一次迭代中使用的结果对象。所有迭代完成后,将返回最终项目(在这种情况下为合并的对象)。
答案 2 :(得分:0)
仅使用标准的unix shell实用程序(假设您在file.txt
中输入内容)就可以实现您的要求:
bash $ echo { \"$(<file.txt sed 's/,/":"/g' | paste -s -d, - | sed 's/,/","/g')\" }
{ "test":"test","test1":"test1" }
bash $