我想使用Jq将文本文件数据转换为JSON

时间:2018-10-11 13:09:12

标签: json bash shell scripting jq

文件中的日期看起来像

test,test
test1,test1

我想将其转换为:

{"test":"test","test1":"test1"}

我为此目的尝试过jq jq -R -s -c 'split("\n")'

但其输出格式为["test,test","test1,test1",""]

3 个答案:

答案 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所示,将inputssplit函数一起使用。但是要将键/值合并到一个对象中,请使用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 $ 
  • 输出结果是有效的json